Emacs Lispプログラムをレキシカル束縛に変換するのは簡単です。まず、Emacs Lispソースファイルのヘッダー行に、lexical-bindingからtまでを設定するファイルローカル変数を追加します(ファイルローカル変数を参照)。次に、プログラム内で動的に束縛する必要があるすべての変数に変数定義がなされており、意図せずレキシカルに束縛されていないことを確認してください。
どの変数に定義が必要かを確認する簡単な方法は、ソースファイルをバイトコンパイルすることです。バイトコンパイルを参照してください。特殊な変数ではない変数がlet形式以外で使用されている場合、バイトコンパイラはフリー変数への参照または代入について警告します。特殊な変数ではない変数が束縛されているもののlet形式内で使用されていない場合、バイトコンパイラは未使用の字句変数について警告します。また、特殊な変数を関数の引数として使用した場合にも、バイトコンパイラは警告を出力します。
フリー変数への参照や代入に関する警告は、通常、その変数を動的スコープとして指定すべきであるという明確な兆候であるため、その変数を初めて使用する前に適切な
defvar を追加する必要があります。
未使用変数に関する警告は、その変数が動的スコープを想定していた(実際には使用されているが、別の関数内であるため)ことを示す有用なヒントになる場合があります。一方で、単に本当に使用されておらず、削除しても問題ないことを示している場合もあります。したがって、どちらのケースに該当するかを見極め、それに基づいて
defvar
を追加するか、あるいは変数自体を完全に削除する必要があります。削除が不可能、あるいは望ましくない場合(通常は形式引数であり、すべての呼び出し元を変更することができない、あるいは変更したくない場合など)は、変数名の先頭にアンダースコアを追加することで、これが使用されないことが分かっている変数であることをコンパイラに示すこともできます。)
注意: これは実験的な機能であり、予告なく変更または廃止される可能性があります。
バイトコンパイラは、他のEmacs Lispファイルにおいて特殊な意味を持つ字句変数についても警告を出すことがあり、これは多くの場合、defvar 宣言の欠落を示しています。この有用ながらもやや専門的なチェックには、3つの手順が必要です:
EMACS_GENERATE_DYNVARS
に空でない文字列を設定してバイトコンパイルします。これらは通常、同一パッケージや関連パッケージ、あるいは Emacs
サブシステム内のすべてのファイルです。この処理により、コンパイルされた Emacs Lisp ファイルごとにファイル名が .dynvars で終わるファイルが生成されます。
EMACS_DYNVARS_FILE
にはステップ2で作成した集約ファイルの名前を設定してください。
バイトコンパイルに Unix シェルと make
を使用すると想定した場合の、具体的な実装例を以下に示します。
$ rm *.elc # force recompilation $ EMACS_GENERATE_DYNVARS=1 make # generate .dynvars $ cat *.dynvars > ~/my-dynvars # combine .dynvars $ rm *.elc # force recompilation $ EMACS_DYNVARS_FILE=~/my-dynvars make # perform checks