summaryrefslogtreecommitdiff
path: root/general.sml
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