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