diff --git a/ruby/lib/lox/interpreter.rb b/ruby/lib/lox/interpreter.rb index 34cf8f3..d194c00 100644 --- a/ruby/lib/lox/interpreter.rb +++ b/ruby/lib/lox/interpreter.rb @@ -9,6 +9,7 @@ module Lox def initialize(env=Environment.new) @globals = env @env = @globals + @locals = {} @globals.define("clock", Class.new { def arity = 0 @@ -28,6 +29,10 @@ module Lox def evaluate(expr) = expr.accept(self) def execute(stmt) = stmt.accept(self) + def resolve(expr, depth) + @locals[expr] = depth + end + def visit_block(stmt) execute_block(stmt.stmts, Environment.new(@env)) nil @@ -116,7 +121,16 @@ module Lox end def visit_variable(expr) - @env.get(expr.name) + lookup_var(expr.name, expr) + end + + def lookup_var(name, expr) + if @locals.has_key?(expr) + distance = @locals.fetch(expr) + @env.get_at(distance, name.lexeme) + else + @globals.get(name) + end end def visit_assign(expr)