Next: Converting to Lexical Binding, Previous: Lexical Binding, Up: Variable Scoping [Contents][Index]
Emacs
LispファイルのロードやLispバッファーを評価するとき、バッファーローカルな変数lexical-bindingが非nilなら、レキシカルバインディングが有効になります:
このバッファーローカルな変数が非nilなら、Emacs
Lispファイルとバッファーはダイナミックバインディングではなくレキシカルバインディングを使用して評価される(しかし特別な変数はダイナミックにバインドされたまま。以下を照)。nilならすべてのローカル変数にたいしてダイナミックバインディングが使用される。この変数は、通常はファイルローカル変数として、Emacs
Lispファイル全体にたいしてセットされる(File Local Variablesを参照)。他のファイルローカル変数などとは異なり、ファイルの最初の行でセットされなければならないことに注意。
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を参照)を処理する際にも有効です。
レキシカルバインディングが有効な場合でも、特定の変数はダイナミックにバインドされたままです。これらはスペシャル変数(special
variable)と呼ばれます。defvar、defcustom、defconstで定義されたすべての変数はスペシャル変数です(Defining Variablesを参照)。その他のすべての変数はレキシカルバインディングの対象になります。
値なしでdefvarを使用することにより、他の場所ではレキシカルにバインドされている状態のまま、単一ファイルやファイルの一部だけで変数をダイナミックにバインドすることが可能になります。たとえば:
(let (_) (defvar x) ;xへのletバインドはこのlet内ではダイナミック (let ((x -99)) ; これはxのダイナミックバインド (defun get-dynamic-x () x))) (let ((x 'lexical)) ; これはxのレキシカルバインド (defun get-lexical-x () x)) (let (_) (defvar x) (let ((x 'dynamic)) (list (get-lexical-x) (get-dynamic-x)))) ⇒ (lexical dynamic)
この関数はsymbolがスペシャル変数(つまり変数がdefvar、defcustom、defconstによる定義をもつ)なら非nilをリターンする。、それ以外ならリターン値はnil。
これは関数なので永続的にスペシャルな変数には非nilをリターンできるが、カレントレキシカルスコープでのみスペシャルな変数では異なることに注意。
関数内の正式な引数としてのスペシャル変数の使用はサポートされていません。