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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
open Format
let usage () =
eprintf "Exercises on CPS and de-functionalization@.";
eprintf "Usage: %s" Sys.argv.(0);
exit 2
let input =
if Array.length Sys.argv <> 1 then usage ()
open Defunctionalization
let rec p_expr fmt e =
match e with
| Cte n -> fprintf fmt "%s" (Z.to_string n)
| Sub(e1,e2) ->
fprintf fmt "(%a - %a)" p_expr e1 p_expr e2
let p_prog fmt p = p_expr fmt p
let p_value fmt v =
fprintf fmt "%s" (Z.to_string v)
let run s f p =
let v = f p in
printf "%s %a : %a@." s p_prog p p_value v
let () =
printf "Exercise 0: direct semantics@.";
let i = Defunctionalization.interpret_0 in
run "interpret_0" i Defunctionalization.p0;
run "interpret_0" i Defunctionalization.p1;
run "interpret_0" i Defunctionalization.p2;
run "interpret_0" i Defunctionalization.p3;
run "interpret_0" i Defunctionalization.p4;
printf "Done.@\n@."
(* does not work because lambda is not extracted into OCaml
(fun ... -> ...)
*)
let () =
printf "Exercise 1: CPS@.";
let i = Defunctionalization.interpret_1 in
run "interpret_1" i Defunctionalization.p0;
run "interpret_1" i Defunctionalization.p1;
run "interpret_1" i Defunctionalization.p2;
run "interpret_1" i Defunctionalization.p3;
run "interpret_1" i Defunctionalization.p4;
printf "Done.@\n@."
let () =
printf "Exercise 2: Defunctionalization@.";
let i = Defunctionalization.interpret_2 in
run "interpret_2" i Defunctionalization.p0;
run "interpret_2" i Defunctionalization.p1;
run "interpret_2" i Defunctionalization.p2;
run "interpret_2" i Defunctionalization.p3;
run "interpret_2" i Defunctionalization.p4;
printf "Done.@\n@."
|