public object VisitFunctionStatement(FunctionStatement statement) { var function = new LoxFunction(statement, environment); environment.Define(statement.Name, function); return(null); }
public object VisitClassStatement(ClassStatement statement) { object superclass = null; if (statement.Superclass != null) { superclass = Evaluate(statement.Superclass); if (!(superclass is LoxClass)) { throw new LoxRunTimeException(statement.Superclass.Name, "Superclass must be a class."); } } environment.Define(statement.Name, null); if (statement.Superclass != null) { environment = new Environment(environment); environment.Define(superToken, superclass); } var methods = new Dictionary <string, LoxFunction>(); foreach (var method in statement.Methods) { var function = new LoxFunction(method, environment, LoxClass.IsInitializer(method)); methods.Add(method.Name.Lexeme, function); } var loxClass = new LoxClass(statement.Name.Lexeme, (LoxClass)superclass, methods); if (superclass != null) { environment = environment.Enclosing; } environment.Assign(statement.Name, loxClass); return(null); }