Commit 8d8fab9

mo khan <mo@mokhan.ca>
2013-11-27 03:22:27
create machine.
1 parent 8dd2d0c
Changed files (1)
spec
spec/practice/expression_spec.rb
@@ -0,0 +1,84 @@
+require "spec_helper"
+
+class Machine < Struct.new(:expression)
+  def step
+    self.expression = expression.reduce
+  end
+
+  def run
+    while expression.reducible?
+      puts expression
+      step
+    end
+    puts expression
+  end
+end
+
+class Number < Struct.new(:value)
+  def reducible?
+    false
+  end
+
+  def to_s
+    value.to_s
+  end
+
+  def inspect
+    "<<#{self}>>"
+  end
+end
+
+class Add < Struct.new(:left, :right)
+  def reducible?
+    true
+  end
+
+  def reduce
+    if left.reducible?
+      Add.new(left.reduce, right)
+    elsif right.reducible?
+      Add.new(left, right.reduce)
+    else
+      Number.new(left.value + right.value)
+    end
+  end
+
+  def to_s
+    "(#{left} + #{right})"
+  end
+
+  def inspect
+    "<<#{self}>>"
+  end
+end
+
+class Multiply < Struct.new(:left, :right)
+  def reducible?
+    true
+  end
+
+  def reduce
+    if left.reducible?
+      Multiple.new(left.reduce, right)
+    elsif right.reducible?
+      Multiple.new(left, right.reduce)
+    else
+      Number.new(left.value * right.value)
+    end
+  end
+
+  def to_s
+    "(#{left} * #{right})"
+  end
+
+  def inspect
+    "<<#{self}>>"
+  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))))
+    p machine.run
+  end
+end