File: susp.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (25 lines) | stat: -rw-r--r-- 439 bytes parent folder | download | duplicates (5)
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
(*
 * Force/delay
 *
 * -- Allen
 *)

signature SUSPENSION =
sig
   type 'a susp
   val $$ : (unit -> 'a) -> 'a susp
   val !! : 'a susp -> 'a
end

structure Suspension :> SUSPENSION =
struct
   datatype 'a thunk = VALUE of 'a | CLOSURE of unit -> 'a
   type 'a susp = 'a thunk ref 

   fun $$ e = ref(CLOSURE e)
   fun !! (ref (VALUE v)) = v
     | !! (r as ref(CLOSURE e)) = 
       let val v = e()
       in  r := VALUE v; v end  
end