バイトコンパイルによるエラーおよび警告メッセージは、*Compile-Log* という名前のバッファに出力されます。これらのメッセージには、問題の箇所を特定するためのファイル名と行番号が含まれています。コンパイラ出力を操作するための通常の Emacs コマンドを、これらのメッセージに対しても使用できます。
プログラムの構文が不正であることに起因するエラーが発生した場合、バイトコンパイラはエラーの正確な位置を特定できなくなることがあります。調査方法の一つとして、バッファ *Compiler Input* に切り替える方法があります。(このバッファ名はスペースで始まるため、バッファメニューには表示されません。)このバッファにはコンパイル中のプログラムが含まれており、ポインタはバイトコンパイラがどこまで読み込めたかを示しています。エラーの原因はその付近にある可能性があります。構文エラーの特定に関するヒントについては、無効なLisp構文のデバッグを参照してください。
バイトコンパイラが出力する一般的な警告の一つに、使用されたものの定義されていない関数や変数に関するものがあります。こうした警告では、欠落している関数や変数が使用されていた箇所ではなく、ファイル末尾の行番号が報告されます。これらを特定するには、ファイルを手動で検索する必要があります。
関数や変数が見つからないという警告メッセージが不当であると確信している場合は、それを抑制する方法がいくつかあります:
fboundp の判定を条件にすることで、特定の関数呼び出し func に対する警告を抑制できます。
(if (fboundp 'func) ...(func ...)...)
func への呼び出しは if の then-form 内に記述する必要があり、func は fboundp への呼び出しの中で引用符で囲んで記述しなければなりません。(この機能は cond でも同様に動作します。)
boundp の判定を条件とすることで、変数 variable の特定の使用箇所における警告を抑制できます:
(if (boundp 'variable) ...variable...)
variableへの参照はifのthen-form内になければならず、variableはboundpの呼び出しにおいて引用符で囲まれて出現しなければならない。
declare-functionを用いて定義されていることをコンパイラに伝えることができます。関数が定義されていることをコンパイラに伝えるを参照してください。
defvar
を用いて定義することをコンパイラに指定できます。(なお、これにより変数は特殊、すなわち動的束縛として扱われますが、これは現在の字句スコープ内、あるいはトップレベルであればファイル内でのみ適用されます。)グローバル変数の定義を参照してください。
また、with-suppressed-warnings
マクロを使用して、特定の式内でのコンパイラ警告を抑制することもできます。
実行上、これは (progn body...)
と同等ですが、コンパイラは body で指定された条件に対して警告を出しません。 warnings は、警告シンボルと、それらが適用される関数・変数シンボルの関連付けリストです。
例えば、foo
という廃止された関数を呼び出したいが、コンパイル警告を抑制したい場合は、次のように記述します。
(with-suppressed-warnings ((obsolete foo)) (foo ...))
コンパイラ警告をより粗粒度に抑制するには、with-no-warnings 構文を使用できます:
実行上は (progn body...)
と同等ですが、コンパイラは body の内部で発生する事象に対して警告を出しません。
代わりに with-suppressed-warnings
を使用することを推奨しますが、この構文を使用する場合は、抑制しようとしている警告以外の警告を見逃さないよう、可能な限り最小限のコード範囲で使用してください。
Byteコンパイラの警告は、変数 byte-compile-warnings
を設定することでより細かく制御できます。詳細はそのドキュメント文字列を参照してください。
バイトコンパイラの警告を error を用いて報告させたい場合があります。その場合は、byte-compile-error-on-warn に nil 以外の値を設定してください。