Exemple #1
0
        public bool Apply(out object answer, ref Control expression, ref Environment environment, object [] args)
        {
#if DEBUG
            Entity.applicationCount += 1;
#endif
            object [] adjustedArgs = new object [args.Length + 1];
            Array.Copy(args, 0, adjustedArgs, 1, args.Length);
            adjustedArgs [0] = this.first;
            return(Interpreter.Apply(out answer, ref expression, ref environment, this.first, adjustedArgs));
        }
Exemple #2
0
        public override bool Continue(out object answer, ref Control expression, ref Environment environment, object value)
        {
            object [] evaluated = this.evaluated;
            object    rator     = null;
            int       counter   = this.counter;

            if (counter == 0)
            {
                rator = value;
            }
            else
            {
                evaluated [--counter] = value;

                while (counter > -1)
                {
                    Control     expr = this.expression.Components [counter];
                    Environment env  = environment;
                    object      ev   = null;
                    while (expr.EvalStep(out ev, ref expr, ref env))
                    {
                    }
                    ;
                    if (ev == Interpreter.UnwindStack)
                    {
                        ((UnwinderState)env).AddFrame(new CombinationFrame(this.expression, environment, evaluated, counter));
                        environment = env;
                        answer      = Interpreter.UnwindStack;
                        return(false);
                    }
                    if (counter == 0)
                    {
                        rator = ev;
                        break;
                    }
                    else
                    {
                        evaluated [--counter] = ev;
                    }
                }
            }

            return(Interpreter.Apply(out answer, ref expression, ref environment, rator, evaluated));
        }
Exemple #3
0
        public override bool EvalStep(out object answer, ref Control expression, ref Environment environment)
        {
#if DEBUG
            Warm("-");
            histogram.Note(this.histogramKey);
            combinationSizeHistogram.Note(this.components.Length);
            SCode.location = "Combination";
#endif
            object    rator     = null;
            object [] evaluated = new object [this.components.Length - 1];
            int       counter   = this.components.Length - 1;
            while (counter > -1)
            {
                object      ev;
                Environment env  = environment;
                Control     expr = components [counter];
#if DEBUG
                NoteCalls((SCode)expr);
#endif
                while (expr.EvalStep(out ev, ref expr, ref env))
                {
                }
                ;
#if DEBUG
                SCode.location = "Combination";
#endif
                if (ev == Interpreter.UnwindStack)
                {
                    ((UnwinderState)env).AddFrame(new CombinationFrame(this, environment, evaluated, counter));
                    environment = env;
                    answer      = Interpreter.UnwindStack;
                    return(false);
                }
                if (counter == 0)
                {
                    rator = ev;
                    break;
                }
                else
                {
                    evaluated [--counter] = ev;
                }
            }
            switch (evaluated.Length)
            {
            case 0:
                return(Interpreter.Call(out answer, ref expression, ref environment, rator));

            case 1:
                Debugger.Break();
                return(Interpreter.Call(out answer, ref expression, ref environment, rator, evaluated [0]));

            case 2:
                Debugger.Break();
                return(Interpreter.Call(out answer, ref expression, ref environment, rator, evaluated [0], evaluated [1]));

            case 3:
                return(Interpreter.Call(out answer, ref expression, ref environment, rator, evaluated [0], evaluated [1], evaluated [2]));

            default:
                return(Interpreter.Apply(out answer, ref expression, ref environment, rator, evaluated));
            }
        }