src/Pure/Concurrent/lazy_sequential.ML
author boehmes
Wed, 18 Nov 2009 14:00:08 +0100
changeset 33749 8aab63a91053
parent 33023 207c21697a48
child 34278 228f27469139
permissions -rw-r--r--
optionally trace theorems used in proof reconstruction
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32817
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Concurrent/lazy_sequential.ML
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     2
    Author:     Florian Haftmann and Makarius, TU Muenchen
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     3
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     4
Lazy evaluation with memoing (sequential version).
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     5
*)
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     6
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     7
structure Lazy: LAZY =
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     8
struct
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
     9
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    10
(* datatype *)
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    11
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    12
datatype 'a expr =
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    13
  Expr of unit -> 'a |
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    14
  Result of 'a Exn.result;
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    15
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    16
abstype 'a lazy = Lazy of 'a expr Unsynchronized.ref
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    17
with
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    18
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    19
fun peek (Lazy r) =
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    20
  (case ! r of
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    21
    Expr _ => NONE
32844
wenzelm
parents: 32817
diff changeset
    22
  | Result res => SOME res);
32817
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    23
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    24
fun lazy e = Lazy (Unsynchronized.ref (Expr e));
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    25
fun value a = Lazy (Unsynchronized.ref (Result (Exn.Result a)));
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    26
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    27
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    28
(* force result *)
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    29
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    30
fun force_result (Lazy r) =
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    31
  (case ! r of
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    32
    Expr e => Exn.capture e ()
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    33
  | Result res => res);
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    34
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    35
fun force r = Exn.release (force_result r);
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    36
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    37
end;
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    38
end;
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    39
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    40
type 'a lazy = 'a Lazy.lazy;
4ed308181f7f Lazy evaluation with memoing (sequential version).
wenzelm
parents:
diff changeset
    41