Emacs Lispファイルを読み込んだりLispバッファを評価したりする際、バッファローカル変数 lexical-binding を用いてLisp方言が選択されます。
このバッファローカル変数が nil 以外の場合、Emacs Lisp
のファイルおよびバッファは、デフォルトで動的束縛ではなく字句束縛を用いるモダンな Lisp 方言で評価されます。nil
の場合は、すべてのローカル変数に動的束縛を用いる旧来の方言が使用されます。この変数は通常、ファイルローカル変数として Emacs Lisp
ファイル全体に設定されます(ファイルローカル変数
を参照)。なお、他の同様の変数とは異なり、この変数はファイルの1行目で設定する必要があります。
実際には、方言の選択とは、Emacs Lispファイルの1行目が次のようになることを意味します:
;;; ... -*- lexical-binding: t -*-
現代の語彙結合方言、および
;;; ... -*- lexical-binding: nil -*-
従来の動的型付け専用ダイアレクト向け。(これはレキシカルバインディング・クッキーとして知られています。)宣言がない場合は従来のダイアレクトが使用されますが、これは将来のリリースで変更される可能性があります。宣言がない場合は、コンパイラが警告を表示します。
eval 呼び出しを用いて Emacs Lisp コードを直接評価する場合、eval の引数 lexical が nil 以外であれば、字句束縛が有効になります。Eval を参照してください。
レキシカルバインディングは、*scratch* および *ielm* バッファで使用される Lisp Interaction および IELM モードでも、M-: (eval-expression)
経由で式を評価する場合でも、Emacs の --eval、-x、--script
コマンドラインオプションを処理する場合(The GNU Emacs Manual の Action
Arguments を参照)、および emacsclient の --eval コマンドラインオプションを処理する場合(The GNU
Emacs Manual の emacsclient
Options を参照)でも有効になります。