aboutsummaryrefslogtreecommitdiff
path: root/miniMAL/env.json
diff options
context:
space:
mode:
Diffstat (limited to 'miniMAL/env.json')
-rw-r--r--miniMAL/env.json42
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
+]