OCamlSpotter を使う
インストールについてはこちらを参照してください。
まずパスを設定して動作確認
PREFIX/bin をパスに入れてください。設定方法はシェルによって違うので書きません。
設定を変えてから、
$ ocaml Objective Caml version 3.11.0+ocamlspotter #
となっているか確認してね。
なんか書いてみる
fib.ml:
let rec fib n = match n with | 1 | 2 -> 1, 1 | _ -> let f_1, f_2 = fib (n-1) in f_1 + f_2, f_1 let fib n = fst (fib n)
-annot スイッチ付きでコンパイルしてみる:
$ ocamlc -annot -c fib.ml
fib.cmo, fib.cmi, fim.annot の他に、fib.spot というファイルが出来ていますか?fib.spot はバイナリファイルですが、ocamlspot プログラムを使うとそこから役に立つ情報を引き出すことが出来ます。
兎に角早く Emacs でサクサク使いたいという人は、次の ocamlspot.el から使うまですっ飛ばしておk。
例えば、
$ ocamlspot -dump-lannots fib.spot
とするとソースコード位置に結び付けられた情報を眺めることが出来ます。
さて、この位置情報を使って定義を探してみよう。fib.ml に出てくる最後の fib は133バイト目にあるので、その定義位置を探すには ocamlspot fib.ml:133 とやる:
$ ocamlspot fib.ml:133 cwd: /home/camlspotter/tmp Tree: 132:135 Use(Value, fib_58); Type: int -> int * int; Spot: /home/camlspotter/tmp/fib.ml:8:11 BYE!
なんか色々無節操に出て来たが、最後から二行目の Spot: /home/camlspotter/tmp/fib.ml:8:11 がその答。fib.ml の 8バイト目から11バイト目に定義があります。一番始めの fib の所だ。
ocamlspot.el から使う
ocamlspot は単純なコマンドラインツールなので、人間には使いづらい。Emacs を使っている人は、ソース中にある、ocamlspot/ocamlspot.el を使えば、カーソル位置を利用して ocamlspot を呼び出し、その結果を自動的に表示してくれるようになる。vi の人はすいませんが、何も用意していません。でも基本は上の通りだから、インターフェースを書くのは簡単だと思う。
ocamlspot.el の設定
ocamlspot.el をどこか適当なところに置く。(caml-mode.el と同じく、make install ではインストールされません。)
自分の .emacs に次のように書き込む:
(setq load-path (cons (expand-file-name "<.elをインストールしたディレクトリ名>") load-path)) (setq ocamlspot-path (expand-file-name "<PREFIXで設定したディレクトリ名>/bin/ocamlspot")) ; ocamlspot.opt でもいいよ (autoload 'ocamlspot-query "ocamlspot" "OCamlSpot")
後はキーバインディングを仕込むんだけど、もちろん、caml-mode か tuareg-mode を使っているよね?次は caml-mode の場合:
(add-hook 'caml-mode-hook (function (lambda () ... 他にもいろいろとあるよね ... (local-set-key "\C-c;" 'ocamlspot-query) )))
はい、これで準備完了。