1 package scm; 2 3 6 import java.util.*; 7 8 class Env 9 { 10 Hashtable bindings=null; static Object MAGIC_KLUDGE="**jas-nil-internal"; 13 15 Env parent; 16 17 Obj lookup(Symbol cvar) 18 { 19 Object 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 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 toString() 97 { 98 String ret; 99 100 return ("Binding is " + bindings + "\nparent is " + parent); 101 } 102 } 103 | Popular Tags |