Reputation: 2362
I try to define operational semantics in Ruby, just for learning purposes. And I'd like to define operations like: add, multiply, subtraction, division.
Here is code:
class Operation < Struct.new(:left, :right)
def inspect
"#{self}"
end
def reducible?
true
end
end
class Add < Operation
def to_s
"#{left} + #{right}"
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
end
class Multiply < Operation
def to_s
"#{left} * #{right}"
end
def reduce
if left.reducible?
Multiply.new(left.reduce, right)
elsif right.reducible?
Multiply.new(left, right.reduce)
else
Number.new(left.value + right.value)
end
end
end
Is it possible to have the same thing, but define reduce
in Operation
class, but create instance of some particular child class in Operation
class?
Thanks in advance.
Upvotes: 1
Views: 43
Reputation: 168199
Yes.
class Operation
def reduce
if left.reducible?
self.class.new(left.reduce, right)
elsif right.reducible?
self.class.new(left, right.reduce)
else
Number.new(left.value + right.value)
end
end
end
Upvotes: 5