Пример #1
0
        public BasilFunction Bind(BasilInstance instance)
        {
            Environment environment = new Environment(closure);

            environment.Define("this", instance);
            return(new BasilFunction(declaration, environment, isInitializer));
        }
Пример #2
0
        public object Call(Interpreter interpreter, List <object> arguments)
        {
            BasilInstance instance = new BasilInstance(this);

            if (methods.TryGetValue("init", out BasilFunction initializer))
            {
                initializer.Bind(instance).Call(interpreter, arguments);
            }
            return(instance);
        }
Пример #3
0
 public BasilFunction FindMethod(BasilInstance instance, string name)
 {
     if (methods.ContainsKey(name))
     {
         return(methods[name].Bind(instance));
     }
     if (superclass != null)
     {
         return(superclass.FindMethod(instance, name));
     }
     return(null);
 }
Пример #4
0
        public object VisitSuperExpr(Expr.Super expr)
        {
            int        distance   = locals[expr];
            BasilClass superclass = (BasilClass)environment.GetAt(distance, "super");
            // "this" is always one level nearer than "super"'s environment.
            BasilInstance objekt = (BasilInstance)environment.GetAt(distance - 1, "this");
            BasilFunction method = superclass.FindMethod(objekt, expr.Method.lexeme);

            if (method == null)
            {
                throw new RuntimeError(expr.Method, $"Undefined property '{expr.Method.lexeme}'.");
            }
            return(method);
        }