Commit 8d8fab9
Changed files (1)
spec
practice
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