public object Eval(Object[] args) { // Debug.WriteLine("Closure.Eval: ids:" + ids + " args: " + args); Env eval_Env; if (ids != null) { if (all_in_one) // this might bear optimization at some point (esp since +,-,*, etc. use this) { Pair pairargs = Pair.FromArrayAt(args, 0); Object[] newargs = new Object[1]; newargs[0] = pairargs; eval_Env = env.Extend(ids, newargs); } else { eval_Env = env.Extend(ids, args); //tailcall } } else { eval_Env = env; // tailcall } // DebugInfo.SetEnvironment(eval_Env); return(body.Eval(eval_Env)); }
public Extended_Env(Symbol[] inSyms, Object[] inVals, Env inEnv) { this.env = inEnv; for (int pos = 0; pos < inSyms.Length; pos++) { Symbol currSym = (Symbol)inSyms[pos]; if (!currSym.ToString().Equals(".")) { //this.bindings.AddNew(currSym, inVals[pos]); //Hashlist this.bindings[currSym] = inVals[pos]; } else { // multiple values passed in (R5RS 4.1.4) currSym = (Symbol)inSyms[pos + 1]; //this.bindings.AddNew(currSym, Pair.FromArrayAt(inVals,pos)); //Hashlist this.bindings[currSym] = Pair.FromArrayAt(inVals, pos); break; } } }