Merge pull request #383 from asarhaddon/ada2tco-do
[jackhill/mal.git] / mal / env.mal
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")