Posted 2015-03-30 15:21:07 GMT

コンパイルするとずらずらと流れるメッセージですが、あまり気を付けて眺めたこともないなと思ったので、処理系ごとに比較してみたりすることにしました。 比較してみると、案外、処理系毎に違っているみたいです。

比較に使用するファイル

比較に使うファイルですが、コンパイル時のメッセージで良く見掛けそうなメッセージを出したいので、

普通の問題ない、defvar、defun

未定義関数の参照ありのdefun

未定義変数ありのdefun

未使用変数ありのdefun

位を用意してみました。

内容はこんな感じです。

Defvar *a* 1 (Defun a ()) (Defun d () (z)) (Defun dd () (zz)) (Defun b (n)) (Defun c () n) (defun zz ())

関数DはZという未定義関数を含む

関数DDはZZという未定義関数を含むが、ZZはファイルの後でZZの定義あり

関数BはNという変数を未使用

関数Cは、Nという未定義変数を参照

というところです。

以下、だらだらと記載が続きますので、興味のある所だけどうぞ。

LispWorks

まずはLispWorksですが、非常に簡素です。

これだけ。 これだとコンパイルの状況が、あまり良く分からないですが、しかし、SLIMEと組み合せて使っていると、もっと色々警告も拾えている気がするので何か設定があるのかもしれません(:verbose はTにしていますが)。

SBCL

次にお馴染のSBCL。

普通の問題ない、defvar、defun

通常のフォームのコンパイルでは、こんな感じに表示されます。

どうもソースを眺めてみたところトップレベルのフォームを、

let *print-length* 2 print ' ( n ) n defun foo

して表示してるようです。なかなか上手い使い方ですね。

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

ファイル処理中は未定義変数の参照については情報が出ません。

未使用変数ありのdefun

未使用変数については、フォームの処理中にメッセージがでます。

コンパイル単位の終了

未定義変数と関数については、コンパイル単位の終了時にどさっと出てきます。

よく考えてみれば、ファイルが処理し終わるまで確定できないので最後に出すしかないのですが、これだと発生した場所から離れてしまうことになります。

コンパイル単位が長くなれば、それだけ離れてしまいますが、この辺りに謎のメッセージ感を感じてしまうのかもしれません。

ABCL

次にABCL。全体的にSBCLを参考にしている処理系なのでSBCLにほぼ同じですが、未定義変数はスペシャル変数とみなされます。

普通の問題ない、defvar、defun

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

未使用変数ありのdefun

コンパイル単位の終了

そしてコンパイル単位の終了時に未定義関数の警告

Allegro CL

つぎにAllegro CLですが、トップレベルフォームの処理状況は表示されません。

そして、未定義変数はスペシャル変数扱い。

普通の問題ない、defvar、defun

表示なし

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

Warning: Free reference to undeclared variable N assumed special.

未使用変数ありのdefun

Warning: Variable N is never used.

コンパイル単位の終了

Warning: While compiling these undefined functions were referenced: Z from character position 1936 in cmsg.lsp

コンパイル単位の終了で、未定義関数の警告が出ます。

Clozure CL

次にClozure CL。未使用変数は処理時点で警告が出ますがスペシャル変数にはしないようです。

普通の問題ない、defvar、defun

トップレベルフォームは処理時に表示されません。

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

未使用変数ありのdefun

コンパイル単位の終了

そして、コンパイル単位の終了で、未定義関数の警告が出ます。

CMUCL

次にCMUCL。自分的には、未定義変数はスペシャル変数にする印象がありましたが、トップレベルで setq をするとスペシャル変数にするのとごっちゃになっていたようで、未定義変数をスペシャルにする訳ではありませんでした。やはり調べてみるものです。

基本的にCMUCLからフォークしたSBCLをシンプルにした感じです。しかし、シンプルではありますが、縦に長い表示。

普通の問題ない、defvar、defun

のような表示がされます。

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

ファイル処理中は未定義変数の参照については情報が出ません。

未使用変数ありのdefun

コンパイル単位の終了

SBCLと同じく未定義変数/関数の警告がでます。

XCL

次にXCL。ABCLと同じく、SBCLの影響が強いのでSBCLに似ています。

未定義変数は警告のみでスペシャルにはしないようです。

普通の問題ない、defvar、defun

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

未使用変数ありのdefun

コンパイル単位の終了

最後に未定義関数の警告あり。

ECL

次にECL。未定義変数は、グローバル変数とされます。

SBCL風にトップレベルフォームの表示あり。 未定義/未使用変数名の表示の前に、 ! が付くのでgrepしやすいかもしれません。

そして、未定義関数の警告は出ないようです。

普通の問題ない、defvar、defun

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

未定義変数はグローバル変数扱いになります。

未使用変数ありのdefun

コンパイル単位の終了

最後にファイルの処理状況が表示されます。

GCL

ECLの元になったCGLですが、ECLと似ています。

未定義変数はグローバル変数とみなされ、未定義関数の警告はなし。

ECLの挙動はGCLに由来しているようですね。

普通の問題ない、defvar、defun

表示なし。

未定義関数の参照ありのdefun

表示なし。

未定義変数ありのdefun

グローバル変数にするよという表示。

未使用変数ありのdefun

コンパイル単位の終了

No runtime error checking End of Pass 1. End of Pass 2. OPTIMIZE levels: Safety=0, Space=0, Speed=3 Finished compiling cmsg.lsp.

処理状況を表示して終わり。

Lucid CL

ここで自分の趣味ですが、レトロな処理系も眺めてみます。

未定義変数はスペシャル変数扱い、未定義関数はコンパイル単位終了後で警告です。

普通の問題ない、defvar、defun

表示なし。

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

未使用変数ありのdefun

コンパイル単位の終了

未定義関数の警告あり。

Xerox CL

次にXerox CL。未定義変数はスペシャル扱いで、コンパイル単位終了後、未定義関数の警告です。

また、未使用変数については警告はないようです。

普通の問題ない、defvar、defun

Compiling 2 top-level forms ... Done Compiling DEFVAR *A* ... Done Compiling 2 top-level forms ... Done Compiling DEFUN A ... Done

N top-level forms と出ますが、これはマクロ展開後のフォーム数でしょうか。若干の謎です。

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

Compiling DEFUN C Warning: The variable N was unknown and has been declared SPECIAL. ... Done

未使用変数ありのdefun

表示なし。

コンパイル単位の終了

Compiling 4 top-level forms. Warning: The following functions were called in the code just compiled, but are not known to exist: Z -- called from D.

長めの警告文で、未定義関数を警告。

VAX LISP

次にVAX LISPですが、未定義変数はスペシャル扱い、未定義関数は終了時警告です。

未定義変数については終了時にも表示されます。

普通の問題ない、defvar、defun

A compiled.

defun 等はありますが、 defvar の表示はなしのようです。

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

BLOCK C N Warning in C N not declared special or bound lexically, assuming special. Surrounding forms: NC compiled.

未使用変数ありのdefun

Warning in B N bound but value not used. B compiled.

コンパイル単位の終了

Finished compilation of file SYS$SYSDEVICE:[USER.MASSO]CMSG.LSP 0 Errors, 3 Warnings The following are assumed to be functions, but were not declared or defined: Z The following are assumed to be special variables, but were referenced free without being declared or defined: N

最後にコンパイル単位での未定義関数/変数の警告が要約された形で出ます。

なかなか良いですね。

Symbolics CL

次に、Symbolics Open Genera の処理系ですが、

普通の問題ない、defvar、defun

表示なし(who lineというところにコンパイル中の関数はちらっと表示される)

未定義関数の参照ありのdefun

ファイル処理中は未定義関数の参照については情報が出ません。

未定義変数ありのdefun

For Function C While compiling N: The variable N is unknown and has been assumed SPECIAL

未使用変数ありのdefun

For Function B The value of variable N was never used.

コンパイル単位の終了

The following functions were referenced but don't seem defined: Z referenced by D

最後に未定義関数の警告が出ます。

まとめ

以上、だらだらと列記しましたが、VAX LISPあたりがシンプルかつ丁寧という感じですね。

SBCLは分量が多くて親切ともいえますが、逆に欲しい情報が埋もれてしまっている感もあります。

■

