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)); }
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)); }
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)); } }