summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lem_interp/interp_lib.lem3
-rw-r--r--src/lem_interp/run_interp.ml5
-rw-r--r--src/myocamlbuild.ml13
3 files changed, 16 insertions, 5 deletions
diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem
new file mode 100644
index 00000000..19f78df2
--- /dev/null
+++ b/src/lem_interp/interp_lib.lem
@@ -0,0 +1,3 @@
+open Interp ;;
+
+let eval_external name v = v ;;
diff --git a/src/lem_interp/run_interp.ml b/src/lem_interp/run_interp.ml
index 5708834d..940a43bb 100644
--- a/src/lem_interp/run_interp.ml
+++ b/src/lem_interp/run_interp.ml
@@ -1,6 +1,7 @@
open Printf ;;
open Interp_ast ;;
open Interp ;;
+open Interp_lib ;;
let lit_to_string = function
| L_unit -> "unit"
@@ -55,7 +56,7 @@ let act_to_string = function
sprintf "write_mem %s(%s)%s = %s" (id_to_string id) (val_to_string args)
(sub_to_string sub) (val_to_string value)
| Call_extern (name, arg) ->
- "extern call to " ^ name
+ sprintf "extern call %s applied to %s" name (val_to_string arg)
;;
module Reg = struct
@@ -77,7 +78,7 @@ let perform_action ((reg, mem) as env) = function
V_lit L_unit, (Reg.update id value reg, mem)
| Write_mem (id, args, None, value) ->
V_lit L_unit, (reg, Mem.update (id, args) value mem)
- | Call_extern (name, arg) -> failwith "extern calls not implemented" (* XXX *)
+ | Call_extern (name, arg) -> eval_external name arg, env
| _ -> failwith "partial read/write not implemented" (* XXX *)
;;
diff --git a/src/myocamlbuild.ml b/src/myocamlbuild.ml
index 3974e939..fae690db 100644
--- a/src/myocamlbuild.ml
+++ b/src/myocamlbuild.ml
@@ -8,7 +8,14 @@ let lem_dir = "../../../lem" ;;
let lem_libdir = lem_dir / "ocaml-lib/_build" ;;
let lem_lib = lem_libdir / "extract" ;;
let lem = lem_dir / "lem" ;;
-let interp_ast = "lem_interp/interp_ast.lem" ;;
+
+(* Order matters - respect dependencies! *)
+let lem_deps = List.map ((/) "lem_interp") [
+ "interp_ast.lem";
+ "interp.lem";
+ "interp_lib.lem";
+ ] ;;
+let lem_opts = List.fold_right (fun s l -> [A "-i"; P s] @ l) lem_deps [] ;;
dispatch begin function
| After_rules ->
@@ -17,9 +24,9 @@ dispatch begin function
rule "lem -> ml"
~prod: "%.ml"
- ~deps: ["%.lem"; interp_ast]
+ ~deps: ("%.lem" :: lem_deps)
(fun env builder -> Seq [
- Cmd (S [ P lem; A "-i"; P interp_ast; A "-ocaml"; P (env "%.lem") ]);
+ Cmd (S ([ P lem] @ lem_opts @ [ A "-ocaml"; P (env "%.lem") ]));
mv (basename (env "%.ml")) (dirname (env "%.ml"))
]);