summaryrefslogtreecommitdiff
path: root/general.sml
diff options
context:
space:
mode:
Diffstat (limited to 'general.sml')
-rw-r--r--general.sml26
1 files changed, 26 insertions, 0 deletions
diff --git a/general.sml b/general.sml
new file mode 100644
index 0000000..cde0514
--- /dev/null
+++ b/general.sml
@@ -0,0 +1,26 @@
+fun $ (x, y) = x y
+infixr 0 $
+
+fun printLn s = (print s; print "\n")
+
+fun lazy thunk =
+let
+ datatype 'a value =
+ Unevaluated of unit -> 'a |
+ Evaluated of 'a |
+ Exn of exn
+
+ val value = ref $ Unevaluated thunk
+in
+ fn () =>
+ case !value of
+ Unevaluated th =>
+ let
+ val x = th () handle e => (value := Exn e; raise e)
+ val () = value := Evaluated x
+ in
+ x
+ end
+ | Evaluated v => v
+ | Exn e => raise e
+end