public int arity() { LoxFunction initializer = findMethod("init"); if (initializer == null) { return(0); } return(initializer.arity()); }
public object Call(Interpreter interpreter, List <object> args) { LoxInstance instance = new LoxInstance(this); LoxFunction initializer = FindMethod("init"); if (initializer != null) { initializer.Bind(instance).Call(interpreter, args); } return(instance); }
public object visitSuperExpr(Expr.Super expr) { int distance = locals[expr]; LoxClass superClass = (LoxClass)env.getAt( distance, "super"); LoxInstance instance = (LoxInstance)env.getAt( distance - 1, "this"); LoxFunction method = superClass.findMethod(expr.Method.Lexeme); if (method == null) { throw new RuntimeError(expr.Method, $"Undefined propert '{expr.Method.Lexeme}'"); } return(method.bind(instance)); }
public object visitClassStmt(Stmt.Class stmt) { object superClass = null; if (stmt.SuperClass != null) { superClass = evaluate(stmt.SuperClass); if (!(superClass is LoxClass)) { throw new RuntimeError(stmt.SuperClass.Name, "Superclass must be a class."); } } env.define(stmt.Name.Lexeme, null); if (stmt.SuperClass != null) { env = new Envir(env); env.define("super", superClass); } Dictionary <string, LoxFunction> methods = new Dictionary <string, LoxFunction>(); foreach (Stmt.Function method in stmt.Methods) { LoxFunction function = new LoxFunction(method, env, method.Name.Lexeme == "init"); methods[method.Name.Lexeme] = function; } LoxClass klass = new LoxClass(stmt.Name.Lexeme, (LoxClass)superClass, methods); if (stmt.SuperClass != null) { env = env.Enclosing; } env.assign(stmt.Name, klass); return(null); }
public object get(Token name) { object value; if (Fields.TryGetValue(name.Lexeme, out value)) { return(value); } LoxFunction method = Klass.findMethod(name.Lexeme); if (method != null) { return(method.bind(this)); } throw new RuntimeError(name, $"Undefined property '{name.Lexeme}'"); }
public Void VisitClassStmt(Stmt <Void> .Class stmt) { object superclass = null; if (stmt.superclass != null) { superclass = Evaluate(stmt.superclass); if (!typeof(LoxClass).IsInstanceOfType(superclass)) { throw new RuntimeError(stmt.superclass.name, "Superclass must be a class."); } } env.Define(stmt.name.lexeme, null); if (stmt.superclass != null) { env = new Env(env); env.Define("super", superclass); } var methods = new Dictionary <string, LoxFunction>(); foreach (var method in stmt.methods) { var function = new LoxFunction(method, env, method.name.lexeme == "init"); methods.Add(method.name.lexeme, function); } LoxClass klass = new LoxClass(stmt.name.lexeme, (LoxClass)superclass, methods); if (superclass != null) { env = env.enclosing; } env.Assign(stmt.name, klass); return(null); }