36 lines
1.2 KiB
OCaml
36 lines
1.2 KiB
OCaml
(***********************************************************************)
|
|
(* *)
|
|
(* Objective Caml *)
|
|
(* *)
|
|
(* Damien Doligez, projet Para, INRIA Rocquencourt *)
|
|
(* *)
|
|
(* Copyright 1997 Institut National de Recherche en Informatique et *)
|
|
(* en Automatique. All rights reserved. This file is distributed *)
|
|
(* under the terms of the GNU Library General Public License. *)
|
|
(* *)
|
|
(***********************************************************************)
|
|
|
|
(* $Id$ *)
|
|
|
|
(* Module [Lazy]: deferred computations *)
|
|
|
|
type 'a status =
|
|
| Delayed of (unit -> 'a)
|
|
| Value of 'a
|
|
| Exception of exn
|
|
;;
|
|
|
|
type 'a t = 'a status ref;;
|
|
|
|
exception Undefined;;
|
|
|
|
let force l =
|
|
match !l with
|
|
| Value v -> v
|
|
| Exception e -> raise e
|
|
| Delayed f ->
|
|
l := Exception Undefined;
|
|
try let v = f () in l := Value v; v
|
|
with e -> l := Exception e; raise e
|
|
;;
|