コード例 #1
0
ファイル: InterpretingVisitor.cs プロジェクト: mamidon/nlox
 object LookupVariableByResolution(Token name, Expr expr)
 {
     if (!_scopeMap.ContainsKey(expr))
     {
         return(GlobalEnvironment.Get(name));
     }
     else
     {
         var distance = _scopeMap[expr];
         return(_currentEnvironment.GetAt(distance, name));
     }
 }
コード例 #2
0
ファイル: ILoxCallable.cs プロジェクト: mamidon/nlox
        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);
        }