RSpecでHaskell呼び出ししたい
RSpecで、ソースとアクションのspecを分離させると、入力に応じて結果を生成したくなる。
ただ、その生成を別のRuby手続きコードでやっちゃうと、それに用いるメソッド等のチェックも必要になるので、本末転倒する。そこで性質で機能を記述できる外部のシステムを使って例に対する結果を生成したい。
つまるところHaskellを仕様記述言語として使いたいのだ。
ということで、ようするにこんなことが書ければいいなと思った:
it "should ... when foldr" do expected = RunHaskell.main(:mfoldr, "nil", @array.to_hslist).where %{ mfoldr = foldr \elem bottom -> "[" ++ (show elem) ++ ", " ++ bottom ++ "]" } @array.foldr "nil", @array do |elem, bottom| "[" + elem.to_s + ", " + bottom + "]" end.should == expected end
仕組みは簡単で、tmpファイルに対応するhaskellソースを書き込み、systemでrunhaskellを実行し、結果をreadパーズしてrubyオブジェクトにする。
rb_to_hsシリアライズと出力のパーザーが必要。型コンストラクタやtuple、listなどへのマッピングも必要。
- Enumrate#to_hslist
- Enumrate#to_hstuple
- Object#to_hs(ctor_name)
- class HsList
- class HsTuple
- class HsAdt(name, child)
などなど。あとData.Mapあたりにも対応したいかも。