OCamlSpotter alpha1 : 変数の定義へと飛ぶコンパイラ拡張

現時点では external な変数だと追跡できないとか、いろいろ問題もあるのだけれど、すでにかなり役にたつので、alpha1 として公開することにします。(Download)(新バージョン公開しました。詳しくは新しい日付の日記を)

OCamlSpotter は OCaml の -annot オプションを拡張し、変数の定義場所を .spot ファイルに保存する。この .spot ファイルを利用すると、プログラム中の変数から、対応する定義コードを簡単に探し出すことができる。
例えば:
x.ml

let f v = v + 1

y.ml

module Z = X
open Z
let _ = f 1

というファイルがあって、コンパイルされている時、emacs で y.ml 中の f にカーソルを置き、C-c ; とタイプすると、x.ml をロードして、f をハイライト表示してくれる。

今まで、OCaml の複雑なプログラムでは、変数の定義を探すのは、特に同一ファイル内で定義されていない場合大変だった。モジュール名が明示されている場合はまだなんとかなるが、open が濫用されていて、モジュール名が過度に省略されている変数の場合、どのモジュールで定義されているのか、一見判らない:

open M
open N
let _ = f 1 
(* 
  m.ml 内の f なのか
  n.ml 内の f なのか
  はたまた、 m.ml 内の N.f なのか、
  このソースからだけでは判らない 
 *)

その上、参照すべきソースファイルが他のディレクトリの奥底にある場合、そのファイルを探す事から始めなければならなかった。私自身も数ヶ月前から大きなOCamlプロジェクトに参加していて、変数定義を探すためだけにかなりの時間を割いていたのだが、OCamlSpotterを使うことで、このストレスがかなり軽減されつつある。

OCamlSpotterの特徴:

  • 現在、emacs から利用可能。カーソルの指す変数の定義を C-c; で表示する。 (vi でも簡単な wrapper さえ書けば利用できるはず)
  • 定義の存在するモジュールが別ファイルだったり、module aliasing (module M = N)や functor application (module M = F(N))で得られたものでも追跡する
  • 値を定義する.mlファイルが別ディレクトリにあっても追跡できる
  • .spotファイルがサーチパスにあれば、.mlファイルがサーチパスになくても大丈夫
  • unixで確認。windowscygwin とかだと動くかも

インストール方法は tgz の中の INSTALL-ocamlspot.txt に書いておきましたが、カレントディレクトリにだらだらっと展開しちゃうので注意してください。cvs バージョンの ocaml への差分になっています。
もちろん、古典的な find + grep によるサーチは効率は悪いけれど、あれこれ見ている間にコード全体の知識が増えるので、決して完全な無駄ではない。