Emacs
LispファイルのロードやLispバッファーを評価するとき、バッファーローカルな変数lexical-binding
を用いてLisp方言が選択されます。
このバッファーローカルな変数が非nil
なら、Emacs
Lispファイルとバッファーはダイナミックバインディングではなく、デフォルトではレキシカルバインディングを使用する現代的なLisp方言を用いて評価される。nil
ならすべてのローカル変数にたいしてダイナミックバインディングを使用する古い方言が使用される。この変数は、通常はファイルローカル変数として、Emacs
Lispファイル全体にたいしてセットされる(ファイルローカル変数を参照)。他のファイルローカル変数などとは異なり、ファイルの最初の行でセットされなければならないことに注意。
実際のところは以下のような見た目をしたEmacs Lispファイルの1行目が方言の選択を意味します:
;;; ... -*- lexical-binding: t -*-
これは現代的なレキシカルバインディングの方言の場合で、
;;; ... -*- lexical-binding: nil -*-
これは古いダイナミックのみの方言です。何も方言の指定がなければ古い方言が使用されますが、これは将来のリリースで変更されるかもしれません。方言の指定がないと、コンパイラーは警告を発するでしょう。
eval
呼び出しを使用してEmacs
Lispコードを直接評価するとき、eval
のlexical引数が非nil
なら、レキシカルバインディングが有効になります。evalについてを参照してください。
レキシカルバインディングは*scratch*バッファーで使用されるLisp
Interactionモード、および*ielm*バッファーで使用されるIELMモードでも有効であり、M-:
(eval-expression
)を通じた式の評価や、Emacsとemacsclient
(emacsclient Options in The GNU Emacs
Manualを参照)の--evalコマンドラインオプション(Action Arguments in The
GNU Emacs Manualを参照)を処理する際にも有効です。