Expression Problem
- 式と計算を拡張したい
- きちんと型がついていること
- 既存のオブジェクトコードは再コンパイルの必要がないこと
普通のOOPLでも関数型言語でも解けないけど、OCamlでPolymorphic VariantとかPrivate Row Typeを使えば解ける、という話。
さて、Rubyで解いてみる。ポイントはOpen Class。
最初の状態。
IntExpr = Struct.new(:value) PlusExpr = Struct.new(:opr1, :opr2) class IntExpr def eval @value end end class PlusExpr def eval @opr1.eval + @opr2.eval end end
式の拡張。
MinusExpr = Struct.new(:opr1, :opr2) class MinusExpr def eval @opr1.eval + @opr2.eval end end
計算の拡張。
class IntExpr def to_s @value.to_s end end class PlusExpr def to_s @opr1.to_s + " + " + @opr2.to_s end end class MinusExpr def to_s @opr1.to_s + " - " + @opr2.to_s end end
Open Classがあれば、OOPLでもExpression Problemは解けるような気がする。型つけはともかく、コンパイルしないで動くかどうかはわからないけど。だれかコンパイルする言語でやってください。