Commit | Line | Data |
---|---|---|
b18969c0 JM |
1 | using System.Collections.Generic; |
2 | using Mal; | |
3 | using MalVal = Mal.types.MalVal; | |
4 | using MalSymbol = Mal.types.MalSymbol; | |
5 | using MalList = Mal.types.MalList; | |
6 | ||
7 | namespace Mal { | |
8 | public class env { | |
9 | public class Env { | |
10 | Env outer = null; | |
11 | Dictionary<string, MalVal> data = new Dictionary<string, MalVal>(); | |
12 | ||
13 | public Env(Env outer) { | |
14 | this.outer = outer; | |
15 | } | |
16 | public Env(Env outer, MalList binds, MalList exprs) { | |
17 | this.outer = outer; | |
18 | for (int i=0; i<binds.size(); i++) { | |
19 | string sym = ((MalSymbol)binds.nth(i)).getName(); | |
20 | if (sym == "&") { | |
21 | data[((MalSymbol)binds.nth(i+1)).getName()] = exprs.slice(i); | |
22 | break; | |
23 | } else { | |
24 | data[sym] = exprs.nth(i); | |
25 | } | |
26 | } | |
27 | } | |
28 | ||
b8ee29b2 JM |
29 | public Env find(MalSymbol key) { |
30 | if (data.ContainsKey(key.getName())) { | |
b18969c0 JM |
31 | return this; |
32 | } else if (outer != null) { | |
33 | return outer.find(key); | |
34 | } else { | |
35 | return null; | |
36 | } | |
37 | } | |
38 | ||
b8ee29b2 | 39 | public MalVal get(MalSymbol key) { |
b18969c0 JM |
40 | Env e = find(key); |
41 | if (e == null) { | |
42 | throw new Mal.types.MalException( | |
b8ee29b2 | 43 | "'" + key.getName() + "' not found"); |
b18969c0 | 44 | } else { |
b8ee29b2 | 45 | return e.data[key.getName()]; |
b18969c0 JM |
46 | } |
47 | } | |
48 | ||
b8ee29b2 JM |
49 | public Env set(MalSymbol key, MalVal value) { |
50 | data[key.getName()] = value; | |
b18969c0 JM |
51 | return this; |
52 | } | |
53 | } | |
54 | } | |
55 | } |