blob: cde051421ac7d67dbc3e7211b6898c33760bde24 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
|