I am following chapter 2 of Understanding Computation to build a simple Ruby interpreter:
At some point after Class Assign, Variable and Number are defined (which I think is actually irrelevant), I do this in irb
irb(main):001:0> statement = Assign.new(:x, Add.new(Variable.new(:x), Number.new(1)))
=> <<x = x + 1>>
irb(main):002:0> environment = { x: Number.new(2) }
=> {:x=><<2>>}
irb(main):003:0> statement, environment = statement.reduce(environment)
=> [<<x = 2 + 1>>, {:x=><<2>>}]
and everything goes perfectly.
But when I declare statement and environment in .rb file:
def statement
Assign.new(:x, Add.new(Variable.new(:x), Number.new(1)))
end
def environment
{ x: Number.new(2) }
end
something goes wrong when I type statement, environment = statement.reduce(environment) in irb:
irb(main):001:0> statement, environment = statement.reduce(environment)
NoMethodError: undefined method
reducefor nil:NilClass from (irb):1 from /usr/bin/irb:12:in<main>
I don't know if the bug is on the way I declare statement or environment?
How could I declare the variable in .rb file?
I check this question and @variable_name doesn't seems to work with a non-string variable.