-
Notifications
You must be signed in to change notification settings - Fork 0
/
Environment.cs
57 lines (49 loc) · 1.09 KB
/
Environment.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//Copyright (c) 2003, Rich Hickey
//licensed under the BSD license - see license.txt
using System;
using System.Collections;
namespace DotLisp{
internal class Env
{
private Interpreter interp;
Env parent;
Parameter[] vars;
Object[] vals;
internal Env(Parameter[] vars, Object[] vals, Env parent, Interpreter interp)
{
this.vars = vars; this.vals = vals; this.parent = parent;
this.interp = interp;
}
internal Object lookup(Symbol var)
{
Int32 level = 0;
for(Env e = this;e.parent != null;e = e.parent,++level)
{
for(Int32 i = 0;i<e.vars.Length;i++)
{
if(e.vars[i].symbol == var)
return new LocalVariable(level, i, var);
}
}
return var;
}
internal Object getValue(LocalVariable var)
{
return rib(var.level).vals[var.index];
}
internal Object setValue(LocalVariable var, Object newVal)
{
return rib(var.level).vals[var.index] = newVal;
}
internal Env rib(int level)
{
Env ret = this;
while(level > 0)
{
ret = ret.parent;
--level;
}
return ret;
}
}
}