Next: , Previous: , Up: バイトコンパイル   [Contents][Index]


17.6 コンパイラーのエラー

バイトコンパイルのエラーメッセージと警告メッセージは、*Compile-Log*という名前のバッファーにプリントされます。これらのメッセージには、問題となる箇所を示すファイル名と行番号が含まれます。これらのメッセージにたいして、コンパイラー出力を操作する通常のEmacsコマンドが使用できます。

あるエラーがプログラムのシンタックスに由来する場合、バイトコンパイラーはエラーの正確な位置の取得に際して混乱するかもしれません。バッファー *Compiler Input*.にスイッチするのは、これを調べ1つの方法です(このバッファー名はスペースで始まるので、Buffer Menuに表示されない)。このバッファーにはコンパイルされたプログラムと、バイトコンパイラーが読み取った箇所からポイントがどれほど離れているかが含まれ、エラーの原因はその近傍の可能性があります。シンタックスエラーを見つけるヒントについては、無効なLisp構文のデバッグを参照してください。

定義されていない関数や変数の使用は、バイトコンパイラーにより報告される警告のタイプとしては一般的です。そのような警告では、定義されていない関数や変数を使用した位置ではなく、そのファイルの最後の行の行番号が報告されるので、それを見つけるには手作業で検索しなければなりません。

定義のない関数や変数の警告が間違いだと確信できる場合には、警告を抑制する方法がいくつかあります:

with-suppressed-warningsマクロを使用して特定の式にたいするコンパイラーの警告を抑制することもできます:

Special Form: with-suppressed-warnings warnings body…

これは実行においては(progn body...)と等価だが、コンパイラーはbody内の指定したコンディションにたいする警告を発しない。warningsは警告シンボルと、それらを適用する関数/変数シンボルの連想リスト。たとえばfooという時代遅れ(obsolete)の関数を呼び出したいがコンパイル時の警告を抑止したければ、以下のようにする:

(with-suppressed-warnings ((obsolete foo))
  (foo ...))

コンパイラー警告の抑制をより粗く行うにはwith-no-warnings構文を使用できます:

Special Form: with-no-warnings body…

これは実行時には(progn body...)と等価だが、コンパイラーはbodyの中で起こるいかなる事項にたいしても警告を発しない。

わたしたちはかわりにwith-suppressed-warningsの使用を推奨するが、この構文を使用する場合には、あなたが抑制したいと意図する警告以外の警告を失わないようにするために、可能な限り小さいコード断片にたいしてこの構文を使用すること。

変数byte-compile-warningsをセットすることにより、コンパイラーの警告をより詳細に制御できます。詳細は変数のドキュメント文字列を参照してください。

errorを使用してバイトコンパイラーの警告が報告されることを望む場合があるかもしれません。そのような場合にはbyte-compile-error-on-warnを非nil値にセットしてください。