Commit e22b0c7
Changed files (1)
spec
practice
spec/practice/expression_spec.rb
@@ -1,8 +1,8 @@
require "spec_helper"
-class Machine < Struct.new(:expression)
+class Machine < Struct.new(:expression, :environment)
def step
- self.expression = expression.reduce
+ self.expression = expression.reduce(environment)
end
def run
@@ -33,11 +33,11 @@ class Add < Struct.new(:left, :right)
true
end
- def reduce
+ def reduce(environment)
if left.reducible?
- Add.new(left.reduce, right)
+ Add.new(left.reduce(environment), right)
elsif right.reducible?
- Add.new(left, right.reduce)
+ Add.new(left, right.reduce(environment))
else
Number.new(left.value + right.value)
end
@@ -57,11 +57,11 @@ class Multiply < Struct.new(:left, :right)
true
end
- def reduce
+ def reduce(environment)
if left.reducible?
- Multiple.new(left.reduce, right)
+ Multiple.new(left.reduce(environment), right)
elsif right.reducible?
- Multiple.new(left, right.reduce)
+ Multiple.new(left, right.reduce(environment))
else
Number.new(left.value * right.value)
end
@@ -103,17 +103,35 @@ class LessThan < Struct.new(:left, :right)
true
end
- def reduce
+ def reduce(environment)
if left.reducible?
- LessThan.new(left.reduce, right)
+ LessThan.new(left.reduce(environment), right)
elsif right.reducible?
- LessThan.new(left, right.reduce)
+ LessThan.new(left, right.reduce(environment))
else
Boolean.new(left.value < right.value)
end
end
end
+class Variable < Struct.new(:name)
+ def to_s
+ name.to_s
+ end
+
+ def inspect
+ "<<#{self}>>"
+ end
+
+ def reducible?
+ true
+ end
+
+ def reduce(environment)
+ environment[name]
+ end
+end
+
describe "expressions" do
it "can do math" do
machine = Machine.new(Add.new(Multiply.new(Number.new(1), Number.new(2)), Multiply.new(Number.new(3), Number.new(4))))
@@ -124,4 +142,9 @@ describe "expressions" do
it "can check less than" do
puts Machine.new(LessThan.new(Number.new(5), Add.new(Number.new(2), Number.new(2)))).run
end
+
+ it "can assign variables" do
+ environment = { x: Number.new(3), y: Number.new(4) }
+ puts Machine.new(Add.new(Variable.new(:x), Variable.new(:y)), environment).run
+ end
end