diff options
Diffstat (limited to 'general.sml')
-rw-r--r-- | general.sml | 26 |
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 |