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); }
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)); }
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); }
public LoxFunction(Stmt.Function functionDeclaration, CSLoxEnvironment closure) { Closure = closure; this.functionDeclaration = functionDeclaration; }
public LoxFunction(Stmt.Function functionDelcaration, CSLoxEnvironment closure, bool isInitialiser) { this.functionDelcaration = functionDelcaration; Closure = closure; IsInitialiser = isInitialiser; }
public LoxFunction(Stmt.Function functionDelcaration, CSLoxEnvironment closure) { this.functionDelcaration = functionDelcaration; Closure = closure; }