(* ============================================ *)
(* ---------- Test it..! ---------------------- *)
(* Test for standard (continuation) semantics implementations *)
(* handout version [some deletions...] *)
(* some convienences.. *)
fun kont_null v = output(v,halt); (* Econt *)
val end_cont :Ccont = fn any_store => halt;
val qont_null :Dcont = fn any_env => end_cont;
val input = id("input"); (* a shorthand.. *)
val result = id("result");
(* dump the store.... *)
fun dump (sto as store(lo, hi, data) ) =
map ($ fetch sto) (from lo hi);
(* a continuation to dump the store.... *)
fun dump_cont sto = ( print (dump sto); halt );
(* ========== *
(* a continuation to output the store.... *)
fun output_cont (sto as store(lo, hi, data) ) =
let fun put [] = halt
| put (v::vs) = output(v, put vs)
in put (dump sto)
end;
* ========== *)
(* a continuation to output the store.... *)
fun output_cont sto = reduce ( output oo pair ) halt (dump sto);
(* -------------------------------------------- *)
val e1 = num(2);
val e2 = sumof(num(1),num(2));
val Trace_flag = "Test: expressions [ 2, 1+2]";
evaluate e1 env_null kont_null sto_null; (* = 2 *)
evaluate e2 env_null kont_null sto_null; (* = 3 *)
val Trace_flag = "Test: expressions [ 1+2*3 = 7 ]";
evaluate (sumof(num(1), prodof(num(2),num(3))))
env_null kont_null sto_null; (* = 7 *)
(* ------------------------- *)
val Trace_flag = "Test: declaration [ const x = 2 ]";
val dx = constdef("x",num(2)); (* a declaration *)
elaborate dx env_null qont_null sto_null;
(* ========== *
evaluate ( leten( dx, sumof( num(1), id("x") )) )
env_null kont_null sto_null; (* = 3 *)
* ========== *)
(* ----------------------------------------------- *)
(* result := input
*)
val Trace_flag = "Test: result = input [ 1, 2]";
val pgm = prog( assign( "result", input ));
(* run the program on an input *)
run pgm 1;
run pgm 2;
(* ----------------------------------------------- *)
(* result := input + 1
*)
val Trace_flag = "Test: result = input+1 [ 1, 2]";
val pgm = prog( assign( "result", sumof( num(1),input ) ));
(* run the program on an input *)
run pgm 1;
run pgm 2;
(* ----------------------------------------------- *)
(* let const x ~ 2
* in let var y : int
* in y:= 3
* if x