public object Call(Interpreter interpreter, List <object> arguments) { var environment = new LoxEnvironment(_closure); for (int i = 0; i < _declaration.Parameters.Count; i++) { environment.Define(_declaration.Parameters[i].Lexeme, arguments[i]); } try { interpreter.ExecuteBlock(_declaration.Body, environment); } catch (Return returnValue) { if (_isInitializer) { return(_closure.GetAt(0, "this")); } return(returnValue.Value); } if (_isInitializer) { return(_closure.GetAt(0, "this")); } return(null); }
public object VisitSuperExpr(Expr.Super expr) { var distance = _locals[expr]; var superclass = _environment.GetAt(distance, "super") as LoxClass; var obj = _environment.GetAt(distance - 1, "this") as LoxInstance; var method = superclass.FindMethod(expr.Method.Lexeme); if (method == null) { throw new RuntimeError(expr.Method, $"Undefined property '{expr.Method.Lexeme}'."); } return(method.Bind(obj)); }