コード例 #1
0
        public object Call(Interpreter interpreter, List <object> arguments)
        {
            // The environment when/where the function was declared.
            CSLoxEnvironment environment = new CSLoxEnvironment(this.Closure);

            for (int i = 0; i < functionDelcaration.Params.Count; ++i)
            {
                environment.Define(functionDelcaration.Params[i].Lexeme, arguments[i]);
            }
            try
            {
                interpreter.ExecuteBlock(functionDelcaration.Body, environment);
            }
            catch (ReturnValue returnValue) // ugh....
            {
                /// EArly returns in constructors eg ( init(){return;})
                /// Allow it and return 'this'. constructors are weir,d
                if (IsInitialiser)
                {
                    return(Closure.GetAt(0, "this"));
                }
                return(returnValue.Value);
            }
            // Hack to ensure init() ie Constructors only ever return the instance 'this';
            if (this.IsInitialiser)
            {
                return(Closure.GetAt(0, "this"));
            }

            return(null);
        }
コード例 #2
0
        public LoxFunction Bind(LoxInstance instance)
        {
            CSLoxEnvironment environment = new CSLoxEnvironment(this.Closure);

            environment.Define("this", instance);
            // redelcared this function with the correct constext AT RUNTIME.
            return(new LoxFunction(functionDelcaration, environment, IsInitialiser));
        }
コード例 #3
0
        public object Call(Interpreter interpreter, List <object> arguments)
        {
            // The environment when/where the function was declared.
            CSLoxEnvironment environment = new CSLoxEnvironment(this.Closure);

            for (int i = 0; i < functionDeclaration.Params.Count; ++i)
            {
                environment.Define(functionDeclaration.Params[i].Lexeme, arguments[i]);
            }
            try
            {
                interpreter.ExecuteBlock(functionDeclaration.Body, environment);
            }
            catch (ReturnValue returnValue)
            {
                return(returnValue.Value);
            }

            return(null);
        }
コード例 #4
0
 public LoxFunction(Stmt.Function functionDeclaration, CSLoxEnvironment closure)
 {
     Closure = closure;
     this.functionDeclaration = functionDeclaration;
 }
コード例 #5
0
 public LoxFunction(Stmt.Function functionDelcaration, CSLoxEnvironment closure, bool isInitialiser)
 {
     this.functionDelcaration = functionDelcaration;
     Closure       = closure;
     IsInitialiser = isInitialiser;
 }
コード例 #6
0
 public LoxFunction(Stmt.Function functionDelcaration, CSLoxEnvironment closure)
 {
     this.functionDelcaration = functionDelcaration;
     Closure = closure;
 }