[MLton] Continuations and MLton.Vector.create
Vesa Karvonen
vesa.karvonen@cs.helsinki.fi
Wed, 29 Mar 2006 00:48:20 +0300
Quoting Henry Cejtin <henry.cejtin@sbcglobal.net>:
[...]
> The only ugliness to me in the create proposal is the fact that update and
> sub might be squirreled away, so you have to make them raise Fail if they are
> called after create returns.
[...]
Looking at the proposed create function made me think about
continuations. So, I devised the following program:
val () =
let
val v' = ref (Vector.fromList [])
val c = ref NONE
val v = Vector.tabulate
(9, fn i =>
if i <> 4 then 1
else SMLofNJ.Cont.callcc (fn k => (c := SOME k ; 1)))
in
if isSome (!c) then
let val k = valOf (!c)
in v' := v
; c := NONE
; SMLofNJ.Cont.throw k 2 end
else
()
; Vector.app (print o Int.toString) v ; print "\n"
; Vector.app (print o Int.toString) (!v') ; print "\n"
end
Under MLton it prints
111121111
111121111
and under SML/NJ (v110.57) it prints
111121111
111111111
With s/Vector/Array both SML/NJ and MLton produce the same output.
-Vesa Karvonen