Expression Problem

  1. 式と計算を拡張したい
  2. きちんと型がついていること
  3. 既存のオブジェクトコードは再コンパイルの必要がないこと

普通の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は解けるような気がする。型つけはともかく、コンパイルしないで動くかどうかはわからないけど。だれかコンパイルする言語でやってください。