バイトコンパイルのエラーメッセージと警告メッセージは、*Compile-Log*という名前のバッファーにプリントされます。これらのメッセージには、問題となる箇所を示すファイル名と行番号が含まれます。これらのメッセージにたいして、コンパイラー出力を操作する通常のEmacsコマンドが使用できます。
あるエラーがプログラムのシンタックスに由来する場合、バイトコンパイラーはエラーの正確な位置の取得に際して混乱するかもしれません。バッファー *Compiler Input*.にスイッチするのは、これを調べ1つの方法です(このバッファー名はスペースで始まるので、Buffer Menuに表示されない)。このバッファーにはコンパイルされたプログラムと、バイトコンパイラーが読み取った箇所からポイントがどれほど離れているかが含まれ、エラーの原因はその近傍の可能性があります。シンタックスエラーを見つけるヒントについては、無効なLisp構文のデバッグを参照してください。
定義されていない関数や変数の使用は、バイトコンパイラーにより報告される警告のタイプとしては一般的です。そのような警告では、定義されていない関数や変数を使用した位置ではなく、そのファイルの最後の行の行番号が報告されるので、それを見つけるには手作業で検索しなければなりません。
定義のない関数や変数の警告が間違いだと確信できる場合には、警告を抑制する方法がいくつかあります:
fboundp
でテストすることで抑制できる:
(if (fboundp 'func) ...(func ...)...)
funcへの呼び出しはif
文のthen-form内になければならず、funcはfboundp
呼び出し内でクォートされていなければならない(この機能はcond
でも同様に機能する)。
boundp
テストで抑制できる:
(if (boundp 'variable) ...variable...)
variableへの参照はif
文のthen-form内になければならず、variableはboundp
呼び出し内でクォートされていなければならない。
declare-function
を使用して定義されていると告げることができる。コンパイラーへの定義済み関数の指示を参照のこと。
defvar
を使用して定義されているとコンパイラーに告げることができる(カレントレキシカルスコープ、またはトップレベルにあればファイルでのみダイナミックにバインドされているとして変数を特別な変数としてマークすることに注意。グローバル変数の定義を参照のこと。
with-suppressed-warnings
マクロを使用して特定の式にたいするコンパイラーの警告を抑制することもできます:
これは実行においては(progn
body...)
と等価だが、コンパイラーはbody内の指定したコンディションにたいする警告を発しない。warningsは警告シンボルと、それらを適用する関数/変数シンボルの連想リスト。たとえばfoo
という時代遅れ(obsolete)の関数を呼び出したいがコンパイル時の警告を抑止したければ、以下のようにする:
(with-suppressed-warnings ((obsolete foo)) (foo ...))
コンパイラー警告の抑制をより粗く行うにはwith-no-warnings
構文を使用できます:
これは実行時には(progn
body...)
と等価だが、コンパイラーはbodyの中で起こるいかなる事項にたいしても警告を発しない。
わたしたちはかわりにwith-suppressed-warnings
の使用を推奨するが、この構文を使用する場合には、あなたが抑制したいと意図する警告以外の警告を失わないようにするために、可能な限り小さいコード断片にたいしてこの構文を使用すること。
変数byte-compile-warnings
をセットすることにより、コンパイラーの警告をより詳細に制御できます。詳細は変数のドキュメント文字列を参照してください。
error
を使用してバイトコンパイラーの警告が報告されることを望む場合があるかもしれません。そのような場合にはbyte-compile-error-on-warn
を非nil
値にセットしてください。