Fall back to 3.11.2

自分の使っている OCaml のバージョンを 3.12.0 から 3.11.2 に戻しました。

OCaml 3.12.0 には First class module や type scheme annotation など非常にあると便利な機能が新しく入っているので、できれば使いたいのですが、問題は付属ツールである CamlP4 にあります。

  • module type of M などの 3.12.0 で導入された新しいシンタクスを理解しない
  • ソースファイルを読み込むとき、時々何故かファイル名情報を忘れるので、そこに引っかかったエラーが発生すると、それを受け取った ocamlc が Error at "ghost-location" とエラー箇所を変にプリントする

第一の問題は 3.12.0 の機能と CamlP4 とを同時には使えないことを意味します。(3.12.0 を使っていても、新機能を使わなければ問題ありません) ですから、コンパイラを 3.11.2 にわざわざ戻す必要はありません。3.12.0 を使いながら 3.11.2 のスタイルを守ればよろしい。ちょっと悲しいですが。

困るのは後者です。CamlP4 を通したソースファイルでエラーが起こるとたまにこの意味不明なエラー箇所表示になります。いや、これも、エラーメッセージの前にどうコンパイラが動いているかを見ればどのファイルかわかるし、エラー箇所もあってるみたいだから、そんなに酷い問題ではないのかもしれません。しかし私はエラーメッセージをパースしてエラー箇所に飛ぶ Emacs lisp を使っているので、それが使えないとなると、使える時とエラーに飛ぶスピードが1/10位になってしまう、これには耐えられませんでした。

と言うわけで私は自分のプロジェクトの OCaml コンパイラのバージョンを 3.11.2 に戻しました。3.12.0 の機能を使ったコードは幾つかありましたが、適当に切り抜けました。3.12.0 の新機能はそれが無いと全く同じコードは書けない、という種類のものでは無いので、何とかなったのです。たとえば ( ゚∀゚)o彡°O’PyCaml は 既に 3.11.2 でコンパイルできるようになっています。OCaml 3.12.0 で開発していた ocamlspotter も 3.11.2 に back-port しました。これももうすぐ 3.11.2, 3.12.0 用両方とも公開します。

CamlP4 はまあ便利なツールではあるのですが、その設計上の致命的な問題が、OCamlソースコードのパーサが OCaml コンパイラのパーサと完全に独立した実装になっている所です。もちろん CamlP4 のパーサデザインはストリームベースで、 OCamlYacc ベースの物とは性質が異なりますし、そもそも CamlP4 は OCaml のソースだけをパースするツールではありませんので、パーサの実装が異なるのはしょうがないのですが…結果として、OCaml 側の文法が拡充されると、その追従がどうしても遅れるというか、追従するの忘れてたやろコラ!プンプン。

私は、また、OCaml をヘビーに使っている人達は基本的に CamlP4 は OCamlソースコードに拡張を加えたものを CamlP4 の OCaml 文法パーサに対応した拡張を足した物でパースすることによってある意味、メタプログラミングを行うのに使っています。その為には、別に OCaml 以外の文法をパースできる、という機能はいらないんですよ。 CamlP4 の汎用的過ぎる面があだになった格好です。とは言え、他に良いツールは無し… 3.11.2 に戻るのが一番確実なようです。今のところ。

3.12.1 では改善されていることを望みます。