diff --git a/hosts/ocaml/bin/run_tests.ml b/hosts/ocaml/bin/run_tests.ml index a78c629..b4084f2 100644 --- a/hosts/ocaml/bin/run_tests.ml +++ b/hosts/ocaml/bin/run_tests.ml @@ -208,7 +208,7 @@ let make_test_env () = bind "env-merge" (fun args -> match args with - | [Env a; Env b] -> Env (Sx_types.env_merge a b) + | [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error "env-merge: expected 2 envs")); (* --- Equality --- *) @@ -280,6 +280,11 @@ let make_test_env () = bind "eval-expr" (fun args -> match args with | [expr; Env e] -> eval_expr expr (Env e) + | [expr; Dict d] -> + (* Dict used as env — wrap it *) + let e = Sx_types.make_env () in + Hashtbl.iter (fun k v -> ignore (Sx_types.env_bind e k v)) d; + eval_expr expr (Env e) | [expr] -> eval_expr expr (Env env) | _ -> raise (Eval_error "eval-expr: expected (expr env)")); bind "scope-push!" (fun args -> diff --git a/hosts/ocaml/bin/sx_server.ml b/hosts/ocaml/bin/sx_server.ml index 504e2d9..5142baf 100644 --- a/hosts/ocaml/bin/sx_server.ml +++ b/hosts/ocaml/bin/sx_server.ml @@ -824,7 +824,7 @@ let make_server_env () = bind "env-merge" (fun args -> match args with - | [Env a; Env b] -> Env (env_merge a b) + | [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error "env-merge: expected 2 envs")); (* Strict mode state *) diff --git a/hosts/ocaml/lib/sx_runtime.ml b/hosts/ocaml/lib/sx_runtime.ml index d40cb20..a8eb1a9 100644 --- a/hosts/ocaml/lib/sx_runtime.ml +++ b/hosts/ocaml/lib/sx_runtime.ml @@ -242,6 +242,14 @@ let type_of v = String (Sx_types.type_of v) The transpiled CEK machine stores envs in dicts as Env values. *) let unwrap_env = function | Env e -> e + | Dict d -> + (* Dict used as env — wrap it. Needed by adapter-html.sx which + passes dicts as env args (e.g. empty {} as caller env). *) + let e = Sx_types.make_env () in + Hashtbl.iter (fun k v -> ignore (Sx_types.env_bind e k v)) d; + e + | Nil -> + Sx_types.make_env () | v -> raise (Eval_error ("Expected env, got " ^ Sx_types.type_of v)) let env_has e name = Bool (Sx_types.env_has (unwrap_env e) (value_to_str name))