Commit e22b0c7

mo khan <mo@mokhan.ca>
2013-11-27 03:32:51
it can assign variables.
1 parent 495a06c
Changed files (1)
spec
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