public InterpretingVisitor() { GlobalEnvironment = new LoxEnvironment(); _assertions = new List <LoxAssertionResult>(); _scopeMap = new Dictionary <Expr, int>(); _currentEnvironment = GlobalEnvironment; var start = DateTime.UtcNow.Ticks; GlobalEnvironment.Define("clock", new LoxNativeCallable(0, (args) => (double)(DateTime.UtcNow.Ticks - start) / 10000)); GlobalEnvironment.Define("assert", AssertLoxNativeCallable.CreateAssertLoxNativeCallable(_assertions)); GlobalEnvironment.Define("stringify", new LoxNativeCallable(1, (arg) => arg[0]?.ToString() ?? "nil")); }
public object Call(InterpretingVisitor interpreter, List <object> arguments) { var environment = new LoxEnvironment(_closure); for (var i = 0; i < Arity(); i++) { environment.Define(_functionStmt.Params[i].Lexeme, arguments[i]); } try { interpreter.Execute(_functionStmt.Body, environment); } catch (LoxReturnException ex) { if (_isInitializer) { throw new LoxReturnException(_closure.GetAt(0, new Token(TokenType.This, "this", null, 0))); } throw; } return(null); }
public void Visit(FunctionStmt stmt) { var callable = new LoxFunctionCallable(stmt, _currentEnvironment); _currentEnvironment.Define(stmt.Name.Lexeme, callable); }