public Object eval(Env env) { DynamicEnv olddenv = DynamicEnv.current(); try { for (int i = 0; i < binds.Length; i++) { DynamicEnv.extend(binds[i].dvar.sym, binds[i].expr.eval(env)); } return(body.eval(env)); } catch (BacktraceException bex) { throw bex; } catch (Exception ex) { throw BacktraceException.push(ex, new BacktraceFrame(loc, "set", null), interpreter); } finally { DynamicEnv.restore(olddenv); } }
internal static void extend(Symbol sym, Object val) { if (!sym.isDynamic) { throw new Exception("Dynamic vars must have prefix *"); } denv = new DynamicEnv(sym, val, denv); }
public void setval(Object val, Env env) { DynamicEnv d = DynamicEnv.find(sym); if (d != null) { d.val = val; } sym.setGlobalValue(val); }
public Object eval(Env env) { DynamicEnv d = DynamicEnv.find(sym); if (d != null) { return(d.val); } return(sym.getGlobalValue()); }
internal static DynamicEnv find(Symbol s) { for (DynamicEnv d = denv; d != null; d = d.next) { if (d.sym == s) { return(d); } } return(null); }
private DynamicEnv(Symbol sym, Object val, DynamicEnv next) { this.sym = sym; this.val = val; this.next = next; }
internal static void restore(DynamicEnv olddenv) { denv = olddenv; }
private DynamicEnv(Symbol sym,Object val, DynamicEnv next) { this.sym = sym; this.val = val; this.next = next; }
internal static void extend(Symbol sym, Object val) { if(!sym.isDynamic) throw new Exception("Dynamic vars must have prefix *"); denv = new DynamicEnv(sym,val,denv); }
internal static void restore(DynamicEnv olddenv) { denv = olddenv; }