aboutsummaryrefslogtreecommitdiff
path: root/miniMAL/env.json
blob: 0dfa67b5f92c6695f1b136e41e083571e36d4275 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
]