Next: Dynamic Binding Tips, Up: Variable Scoping [Contents][Index]
デフォルトでは、Emacsにより作成されるローカル変数のバインディングは、ダイナミックバインディングです。ある変数がダイナミックにバインドされていると、Lispプログラムの実行における任意のポイントでのカレントバインディングは、単にそのシンボルにたいしてもっとも最近作成されたダイナミックなローカルバインディングか、そのようなローカルバインディングが存在しない場合はグローバルバインディングになります。
以下の例のように、ダイナミックバインディングはダイナミックスコープとダイナミック<エクステントをもちます:
(defvar x -99) ;x
は初期値として-99を受け取る。 (defun getx () x) ; この関数内では、x
は“自由”に使用される。 (let ((x 1)) ;x
はダイナミックにバインドされている。 (getx)) ⇒ 1 ;;let
フォームが終了した後、 ;;x
は前の値-99にリバートされる。 (getx) ⇒ -99
関数getx
はx
を参照します。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して、値セルにそれを置きます。