summaryrefslogtreecommitdiff
path: root/general.sml
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-03-24 21:51:16 +0100
committerVladimir Azarov <avm@intermediate-node.net>2025-03-24 21:51:16 +0100
commit87217fe5ba58f5199d30586b5d9bec104dece445 (patch)
tree00a43d11ebdfbb65750e80758ce1925e4c6a1a3e /general.sml
parente40727b58e357f123256557af50666aa42c2caa4 (diff)
Partition into structures
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