You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
603 B
35 lines
603 B
require_relative "instance"
|
|
|
|
module Lox
|
|
class LoxClass
|
|
|
|
attr_reader :name
|
|
|
|
def initialize(name, superclass, methods)
|
|
@name, @superclass, @methods = name, superclass, methods
|
|
end
|
|
|
|
def find_method(name)
|
|
@methods.fetch(name) { @superclass&.find_method(name) }
|
|
end
|
|
|
|
def to_s = name
|
|
|
|
def call(interpreter, args)
|
|
instance = Instance.new(self)
|
|
|
|
if init = find_method("init")
|
|
init.bind(instance).call(interpreter, args)
|
|
end
|
|
|
|
instance
|
|
end
|
|
|
|
def arity
|
|
init = find_method("init")
|
|
init ? init.arity : 0
|
|
end
|
|
|
|
end
|
|
end
|