やっぱOCamlはダメだ

一部を修正してテストしようとすると,全体を修正しなくてはコンパイルが通らないことが往々にしてあり,それはOCamlの周辺ツール群があまりにしょぼいからであるである.この状況は非常にストレスフルな上,開発サイクルに大きな悪影響を及ぼすためなんとかしたいと考えている.

問題

type.mlとかunify.mlとかtyping.mlとかTest_Type.mlとかTest_Unify.mlとかTest_Typing.mlとかmain.mlとかがあって,一つの実行ファイルにコンパイルしてプログラムにするわけだ.ユニットテストを走らせるときにはa.out -testとかにする.

さて,ふと思いついてtype.mlの一部を修正したとする.例えば,自由型変数を求めるType.free_vars関数を修正して,TypeVar.t listではなくTypeVarSet.tを返すようにするとか,そういう修正.この新しいType.free_varsをテストするためには,どのファイルを修正しないといけないだろう?

答えはその全てである.

まず,Test_Type.mlの修正が必要なのは仕方が無い.しかし,unify.mlでもType.free_varsを利用していたので型が変わってしまい,修正する必要がある.すると,Test_Unify.mlも修正しなくてはならない.同様にTyping.mlも修正が必要となり,Test_Typing.mlも修正しなくてはいけない.最後にmain.mlも修正しなくてはいけないかもしれない.

や っ て ら れ る か.*1

解決策

これはユニットテストを実行するために,unify.mlやtyping.mlが必要なことが問題だと思う.Test_Type.mlだけあればユニットテストが実行できれば良いのに,一つのオブジェクトにコンパイルする必要があるから全てのファイルを修正する必要がある.

$ ocamltest Test_Type

とやれば,Test_Type.mlが依存するファイルだけロード/コンパイルして,テストを実行してくれるようなツールがあればそれで問題は解決するような気がするのだ.誰か作ってないのだろうか.

もちろん,がんばってMakefileを書けば,必要十分なモジュールをコンパイルしてテストを実行するようにもできるはずだが,そもそもがんばりたくないし.

*1:普通のOCaml使いはどうやってプログラミングしてるのか,ものすごく気になるのですがどうなんでしょう