Commit | Line | Data |
---|---|---|
31690700 JM |
1 | ;; env |
2 | ||
3 | (def! bind-env (fn* [env b e] | |
4 | (if (empty? b) | |
5 | env | |
6 | ||
7 | (if (= "&" (str (first b))) | |
8 | (assoc env (str (nth b 1)) e) | |
9 | ||
10 | (bind-env (assoc env (str (first b)) (first e)) | |
11 | (rest b) (rest e)))))) | |
12 | ||
13 | (def! new-env (fn* [& args] | |
14 | (if (<= (count args) 1) | |
15 | (atom {"--outer--" (first args)}) | |
16 | (atom (bind-env {"--outer--" (first args)} | |
17 | (nth args 1) (nth args 2)))))) | |
18 | ||
19 | (def! env-find (fn* [env k] | |
20 | (let* [ks (str k) | |
21 | data @env] | |
22 | (if (contains? data ks) | |
23 | env | |
24 | (if (get data "--outer--") | |
25 | (env-find (get data "--outer--") ks) | |
26 | nil))))) | |
27 | ||
28 | (def! env-get (fn* [env k] | |
29 | (let* [ks (str k) | |
30 | e (env-find env ks)] | |
31 | (if e | |
32 | (get @e ks) | |
33 | (throw (str "'" ks "' not found")))))) | |
34 | ||
35 | (def! env-set (fn* [env k v] | |
36 | (do | |
37 | (swap! env assoc (str k) v) | |
38 | v))) | |
39 | ||
40 | ;;(prn "loaded env.mal") |