Merge pull request #194 from dubek/literal-empty-list
[jackhill/mal.git] / groovy / env.groovy
1 import types.MalException
2 import types.MalSymbol
3
4 class env {
5 static class Env {
6 def data
7 def outer
8
9 Env() {
10 outer = null
11 data = [:]
12 }
13 Env(Env outer_env) {
14 outer = outer_env
15 data = [:]
16 }
17 Env(Env outer_env, binds, exprs) {
18 outer = outer_env
19 data = [:]
20 for (int i=0; i<binds.size; i++) {
21 if (binds[i].value == "&") {
22 data[binds[i+1].value] = (exprs.size() > i) ? exprs[i..-1] : []
23 break
24 } else {
25 data[binds[i].value] = exprs[i]
26 }
27 }
28 }
29
30 def set(MalSymbol key, def val) {
31 data[key.value] = val
32 }
33
34 def find(MalSymbol key) {
35 if (data.containsKey(key.value)) {
36 this
37 } else if (outer != null) {
38 outer.find(key)
39 } else {
40 null
41 }
42 }
43
44 def get(MalSymbol key) {
45 def e = find(key)
46 if (e == null) {
47 throw new MalException("'${key.value}' not found")
48 } else {
49 e.data.get(key.value)
50 }
51 }
52 }
53
54 }
55