Exemple #1
0
        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));
        }
Exemple #2
0
        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;
                }
            }
        }