Posted 2015-03-31 15:10:54 GMT

前回色々な処理系のコンパイルメッセージを眺めましたが、色々な表現方法があることを知ると今度はカスタマイズもしてみたくなります。

ということで、普段一番良く使うSBCLをカスタマイズしてみようと処理系内部を眺めてみましたが、残念ながらユーザーがカスタマイズできるようなフックは用意されていません。

いじりやすそうなところを探してみましたが、 sb-c::note-top-level-form が割合にいじり甲斐がありそうなので、ここをいじってみることにしました。

sb-c::note-top-level-form をいじる

sb-c::note-top-level-form はコンパイルしているトップレベルのフォームを表示している所です。 ここを若干VAX LISP風にしてみます。

( form &optional finalp ) when *compile-print* cond not *top-level-form-noted* let *print-length* 2 *print-level* 2 *print-pretty* nil *package* sb-int::*keyword-package* if consp form second form form fctn if consp form first form form op with-compiler-io-syntax cl:defun cl:defmacro ( compiler-mumble #-sb-xc-host "~&~S ~:[compiled~;converted~]." #+sb-xc-host "~&; ~:[x-compiling~;x-converting~] ~S" fctn *block-compile* ) otherwise case op form eq :top-level-forms *compile-print* ( neq form *top-level-form-noted* ) and finalp let *print-length* 1 *print-level* 1 *print-pretty* nil ( with-compiler-io-syntax ( compiler-mumble "~&; ... top level ~S" form ) ) form t *top-level-form-noted* defun note-top-level-form sb-ext:without-package-locks sb-c::

変更したのは、

フォームの表示方式の変更 オペレーター名のシンボルをパッケージ名付きで印字 表示するのは、 defun と defmacro のみ

という所です。

これで

( x y z ) list x y z defun foo

をコンパイルすると

CL-USER::FOO compiled.

という感じになります。

特に意図した訳でもなかったのですが、表示がパッケージ名付きのシンボルになるとデバッグ時に M-. が効くので、非常に便利ということが分かりました。

これだけでもカスタマイズする価値はある感じなので、

( form &optional finalp ) when *compile-print* cond not *top-level-form-noted* let *print-length* 2 *print-level* 2 *print-pretty* nil *package* sb-int:*keyword-package* ( with-compiler-io-syntax ( compiler-mumble #-sb-xc-host "~&; ~:[compiling~;converting~] ~S" #+sb-xc-host "~&; ~:[x-compiling~;x-converting~] ~S" *block-compile* form ) ) form eq :top-level-forms *compile-print* ( neq form *top-level-form-noted* ) and finalp let *print-length* 1 *print-level* 1 *print-pretty* nil ( with-compiler-io-syntax ( compiler-mumble "~&; ... top level ~S" form ) ) form t *top-level-form-noted* defun note-top-level-form sb-ext:without-package-locks sb-c::

こういうのでも良いかもしれません。

これで、

になります。

ちなみに、デフォルトは、

です。

また、 *print-pretty* やら *print-length* を任意に設定すれば、コンパイルしているフォームを丸ごと表示できたりもします。

使えそうな使えなさそうな…。

まとめ

コンパイルメッセージに限りませんが、 M-. が使えそうな所は、できるだけ効くようにしておくとデバッグの時に非常に快適です。

■

