Next: , Up: Variable Scoping   [Contents][Index]


11.9.1 Dynamic Binding

デフォルトでは、Emacsにより作成されるローカル変数のバインディングは、ダイナミックバインディングです。ある変数がダイナミックにバインドされていると、Lispプログラムの実行における任意のポイントでのカレントバインディングは、単にそのシンボルにたいしてもっとも最近作成されたダイナミックなローカルバインディングか、そのようなローカルバインディングが存在しない場合はグローバルバインディングになります。

以下の例のように、ダイナミックバインディングはダイナミックスコープとダイナミック<エクステントをもちます:

(defvar x -99)  ; xは初期値として-99を受け取る。

(defun getx ()
  x)            ; この関数内では、xは“自由”に使用される。

(let ((x 1))    ; xはダイナミックにバインドされている。
  (getx))
     ⇒ 1

;; letフォームが終了した後、
;; xは前の値-99にリバートされる。

(getx)
     ⇒ -99

関数getxxを参照します。defun構造自体の中にxにたいするバインディングが存在しないと意味において、これは“自由”な参照です。xが(ダイナミックに)バインドされているletフォーム内からgetxを呼び出すと、ローカル値(つまり1)が取得されます。しかし、その後letフォームの外側からgetxを呼び出すと、グローバル値(つまり-99)が取得されます。

以下は、setqを使用してダイナミックに変数をバインドする、例をです:

(defvar x -99)      ; xは初期値として-99を受け取る。

(defun addx ()
  (setq x (1+ x)))  ; xに1追加して、新しい値をreturnする。

(let ((x 1))
  (addx)
  (addx))
     ⇒ 3           ; addxを2回呼び出すと、xに2回追加される。

;; letフォームが終了した後、
;; xは前の値-99にリバートされる。

(addx)
     ⇒ -98

Emacs Lispでは、ダイナミックバインディングは、シンプルな方法で実装されています。それぞれのシンボルは、シンボルのカレントのダイナミック値(または値の不在)を指定する値セルをもちます。Symbol Componentsを参照してください。あるシンボルがダイナミックなローカル値を与えられたとき、Emacsは値セルの内容(または値の不在)をスタックに記録し、新しいローカル値を値セルに格納します。バインディング構造が実行を終えたとき、Emacsはスタックから古い値をpopして、値セルにそれを置きます。