Exemple #1
0
        public void Visit(ClassStmt stmt)
        {
            _currentEnvironment.Define(stmt.Name.Lexeme, null);

            var methods = stmt.Methods.Select(m => new {
                Name   = m.Name.Lexeme,
                Method = new LoxFunctionCallable(m, _currentEnvironment, isInitializer: m.Name.Lexeme.Equals("init"))
            }).ToDictionary(tuple => tuple.Name, tuple => tuple.Method);

            var classDefinition = new LoxClass(stmt.Name.Lexeme, methods);

            _currentEnvironment.Assign(stmt.Name, classDefinition);
        }
Exemple #2
0
        public void Assign(Token name, object value)
        {
            if (_state.ContainsKey(name.Lexeme))
            {
                _state[name.Lexeme] = value;
                return;
            }

            if (_enclosingEnvironment != null)
            {
                _enclosingEnvironment.Assign(name, value);
                return;
            }

            throw new LoxRuntimeErrorException(name, $"Undefined variable '{name.Lexeme}'");
        }