KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > scm > Env


1 package scm;
2
3                                 // an environment for the underlying
4
// evaluator
5

6 import java.util.*;
7
8 class Env
9 {
10   Hashtable bindings=null; // bindings are lazily created
11
// during a set variable
12
static Object JavaDoc MAGIC_KLUDGE="**jas-nil-internal";
13                                 // record "null" as this.
14

15   Env parent;
16
17   Obj lookup(Symbol cvar)
18   {
19     Object JavaDoc ret;
20     Env f;
21     Hashtable b;
22
23     for (f=this, ret=null, b=bindings;
24          (ret == null) && (f != null);
25          f = f.parent)
26       {
27         b = f.bindings;
28         if (b != null) { ret = b.get(cvar); }
29       }
30     if (ret == null)
31       { throw new SchemeError("Unbound variable " + cvar); }
32     if (ret == MAGIC_KLUDGE)
33       return null;
34     else
35       return ((Obj)ret);
36   }
37
38   void setvar(Symbol cvar, Obj val)
39   {
40     Object JavaDoc ret;
41     Env f;
42     Hashtable b;
43
44     for (f=this, ret=null, b=bindings;
45          (ret == null) && (f != null);
46          f = f.parent)
47       {
48         b = f.bindings;
49         if (b != null) { ret = b.get(cvar); }
50       }
51     if (ret == null)
52       { throw new SchemeError("Attempted to set unbound variable " + cvar); }
53     if (val == null)
54       { b.put(cvar, MAGIC_KLUDGE); }
55     else
56       { b.put(cvar, val); }
57   }
58
59   void definevar(Symbol v, Obj val)
60   {
61     if (bindings == null) bindings = new Hashtable();
62     if (val == null)
63       { bindings.put(v, MAGIC_KLUDGE); }
64     else
65       { bindings.put(v, val); }
66   }
67
68   Env extendenv(Cell formals, Cell params)
69   {
70     Symbol thissym; Obj thisval;
71     Env ret = new Env();
72
73     ret.parent = this;
74     if (formals == null)
75       {
76         if (params != null)
77           { throw new SchemeError("mismatched arglist to entend env"); } }
78     else
79       {
80         ret.bindings = new Hashtable();
81         while (formals != null)
82           {
83             thissym = (Symbol) formals.car;
84             thisval = params.car;
85             if (thisval == null)
86               {ret.bindings.put(thissym, MAGIC_KLUDGE);}
87             else
88               {ret.bindings.put(thissym, thisval);}
89             formals = formals.cdr;
90             params = params.cdr;
91           }
92         if (params != null)
93           { throw new SchemeError("mismatched arglist to extend env"); } }
94     return ret;
95   }
96   public String JavaDoc toString()
97   {
98     String JavaDoc ret;
99
100     return ("Binding is " + bindings + "\nparent is " + parent);
101   }
102 }
103
Popular Tags