Merge pull request #378 from asarhaddon/test-macro-not-changing-function
[jackhill/mal.git] / cs / env.cs
CommitLineData
b18969c0
JM
1using System.Collections.Generic;
2using Mal;
3using MalVal = Mal.types.MalVal;
4using MalSymbol = Mal.types.MalSymbol;
5using MalList = Mal.types.MalList;
6
7namespace 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}