ikarus/benchmarks.larceny/src/ctak.sml

26 lines
741 B
Standard ML

(* CTAK -- A version of the TAK procedure that uses continuations. *)
fun ctak_aux (k, x, y, z) =
let open SMLofNJ.Cont
in
if not (y < x)
then throw k z
else callcc
(fn (k) =>
ctak_aux (k,
callcc (fn (k) => ctak_aux (k, x-1, y, z)),
callcc (fn (k) => ctak_aux (k, y-1, z, x)),
callcc (fn (k) => ctak_aux (k, z-1, x, y))))
end
fun ctak (x, y, z) =
let open SMLofNJ.Cont
in callcc (fn (k) => ctak_aux (k, x, y, z))
end
fun ctak_benchmark (n) =
run_benchmark ("ctak", ctak_iters, fn () => ctak (18, 12, 6),
fn (x) => x = 7)
fun main () = ctak_benchmark (ctak_iters)