diff options
Diffstat (limited to 'miniMAL/env.json')
| -rw-r--r-- | miniMAL/env.json | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/miniMAL/env.json b/miniMAL/env.json new file mode 100644 index 0000000..0dfa67b --- /dev/null +++ b/miniMAL/env.json @@ -0,0 +1,42 @@ +["do", + +["def", "env-bind", ["fn", ["env", "b", "e"], + ["if", ["empty?", "b"], + "env", + ["if", ["=", ["`", "&"], + ["get", ["first", "b"], ["`", "val"]]], + ["assoc!", "env", ["get", ["nth", "b", 1], ["`", "val"]], "e"], + ["env-bind", ["assoc!", "env", ["get", ["first", "b"], ["`", "val"]], + ["first", "e"]], + ["rest", "b"], + ["rest", "e"]]]]]], + +["def", "env-new", ["fn", ["&", "args"], + ["let", ["env", ["hash-map", ["`", "__outer__"], ["first", "args"]]], + ["if", ["<=", ["count", "args"], 1], + "env", + ["env-bind", "env", ["get", "args", 1], ["get", "args", 2]]]]]], + +["def", "env-find", ["fn", ["env", "key"], + ["let", ["k", ["get", "key", ["`", "val"]]], + ["if", ["contains?", "env", "k"], + "env", + ["if", ["get", "env", ["`", "__outer__"]], + ["env-find", ["get", "env", ["`", "__outer__"]], "key"], + null]]]]], + +["def", "env-get", ["fn", ["env", "key"], + ["let", ["k", ["get", "key", ["`", "val"]], + "e", ["env-find", "env", "key"]], + ["if", "e", + ["get", "e", "k"], + ["throw", ["str", ["`", "'"], "k", ["`", "' not found"]]]]]]], + +["def", "env-set", ["fn", ["env", "key", "val"], + ["let", ["k", ["get", "key", ["`", "val"]]], + ["do", + ["assoc!", "env", "k", "val"], + "val"]]]], + +null +] |
