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