Ejemplo n.º 1
0
        public override TurtValue Eval(ExecutionEnvironment env)
        {
            var procValue = procedure.Eval(env);

            if (!(procValue is TurtProcedure))
            {
                throw new Exception("Attempt to call " + procValue + " (" + procedure + ")");
            }

            var proc = procValue.As <TurtProcedure>().Procedure;

            var arguments = new TurtValue[Math.Min(this.arguments.Count, proc.Parameters.Count)];

            for (int i = 0; i < arguments.Length; i++)
            {
                arguments[i] = this.arguments[i].Eval(env);
            }

            env.PushFrame();
            env.Frame.Scope.Type = ScopeType.PROCEDURE;

            for (int i = 0; i < arguments.Length; i++)
            {
                env.Frame.Scope.Set(proc.Parameters[i].Ident, arguments[i]);
            }

            foreach (var statement in proc.Code)
            {
                try {
                    statement.Eval(env);
                } catch (ReturnException e) {
                    env.PopFrame();
                    return(e.Value);
                }
            }

            env.PopFrame();

            return(TurtNil.NIL);
        }
Ejemplo n.º 2
0
 public ReturnException(TurtValue value)
 {
     this.Value = value;
 }