From 3634c98f745e6fc3b33acc6e3c0ad5e4c3bbb4f0 Mon Sep 17 00:00:00 2001 From: Paul Iannetta <paul.iannetta@ens-lyon.fr> Date: Wed, 15 Jul 2015 17:48:15 +0200 Subject: [PATCH] add stuck function to stdlib --- generator/main.ml | 4 ++-- generator/stdlib_js/stdlib.js | 2 ++ generator/stdlib_ml/stdlib.mli | 1 + generator/tests/calc.js | 37 ++++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 generator/tests/calc.js diff --git a/generator/main.ml b/generator/main.ml index 328b0c7..dc28910 100644 --- a/generator/main.ml +++ b/generator/main.ml @@ -44,6 +44,8 @@ let _ = | Some f -> f in + Printf.printf "sf: %s\n" sourcefile; + (*---------------------------------------------------*) (* "reading and typing source file" *) let (opt, inputfile) = process_implementation_file ppf sourcefile in @@ -55,5 +57,3 @@ let _ = let (logged, unlogged, pre) = Js_of_ast.to_javascript typedtree1 in file_put_contents outputfile unlogged - - diff --git a/generator/stdlib_js/stdlib.js b/generator/stdlib_js/stdlib.js index adbab39..c59d8e5 100644 --- a/generator/stdlib_js/stdlib.js +++ b/generator/stdlib_js/stdlib.js @@ -12,6 +12,8 @@ var geq = function (a, b) { return a >= b } var print = function (x) { console.log(x) } +var stuck = function (msg) { throw {type:'stuck', msg:msg} } + var to_string = function (x) { return String(x) } var parse = function (source) { diff --git a/generator/stdlib_ml/stdlib.mli b/generator/stdlib_ml/stdlib.mli index 4a65911..9298fa4 100644 --- a/generator/stdlib_ml/stdlib.mli +++ b/generator/stdlib_ml/stdlib.mli @@ -21,5 +21,6 @@ val ( >= ) : 'a -> 'a -> 'a val print : 'a -> unit +val stuck : string -> 'a val to_string : 'a -> string val parse : 'a -> 'b diff --git a/generator/tests/calc.js b/generator/tests/calc.js new file mode 100644 index 0000000..a3ab616 --- /dev/null +++ b/generator/tests/calc.js @@ -0,0 +1,37 @@ +var eval_ = function (expr) { + return function () { + switch (expr.type) { + case "Const": var n = expr.value; + return n; + case "Add": var ls = expr.left, rs = expr.right; + return eval_(ls) + eval_(rs); + case "Sub": var ls = expr.left, rs = expr.right; + return eval_(ls) - eval_(rs); + case "Mul": var ls = expr.left, rs = expr.right; + return eval_(ls) * eval_(rs); + case "Div": var ls = expr.left, rs = expr.right; + return eval_(ls) / eval_(rs); + } + }(); +}; +var print_expr = function (expr) { + return function () { + switch (expr.type) { + case "Const": var n = expr.value; + return to_string(n); + case "Add": var ls = expr.left, rs = expr.right; + return "(" + print_expr(ls) + ")" + " + " + print_expr(rs); + case "Sub": var ls = expr.left, rs = expr.right; + return "(" + print_expr(ls) + ")" + " - " + print_expr(rs); + case "Mul": var ls = expr.left, rs = expr.right; + return "(" + print_expr(ls) + ")" + " * " + print_expr(rs); + case "Div": var ls = expr.left, rs = expr.right; + return "(" + print_expr(ls) + ")" + " / " + print_expr(rs); + } + }(); + }; +var f = function () { + var source = parse("((1972 / 29) / 2) + 8"); + return print(print_expr(source) + " = " + to_string(eval_(source))); + }(); + \ No newline at end of file -- GitLab