Пример #1
0
        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"));
        }
Пример #2
0
        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);
        }
Пример #3
0
        public void Visit(FunctionStmt stmt)
        {
            var callable = new LoxFunctionCallable(stmt, _currentEnvironment);

            _currentEnvironment.Define(stmt.Name.Lexeme, callable);
        }