blob: 1434d5b74bd6b2160008fb258a340029b6146b99 (
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
27
28
|
exception Unreachable
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
|