Next: Impl of Scope, Previous: Scope, Up: Variable Scoping
存続期間(Extent)とは、プログラムの実行中において、 変数名が有効である期間を指します。 Emacs Lispでは、束縛を作ったフォームを実行している期間中だけ、 変数は有効です。 これを動的存続期間(dynamic extent)と呼びます。 CやPascalなどのほとんどの言語の『ローカル』変数や『自動』変数も 動的存続期間です。
動的存続期間とは別のものに無限の存続期間(indefinite extent)があります。 つまり、変数束縛は、その束縛を作ったフォームから抜けても存続するのです。 たとえば、Common LispやSchemeにはこれがありますが、Emacs Lispにはありません。
これを説明するために、つぎの関数make-add
を考えます。
この関数は、nに自身の引数mを加算する関数を返します。
この関数はCommon Lispでは動作しますが、Emacs Lispではだめです。
というのは、make-add
の呼び出しを抜けると、
変数nは実引数2に束縛されなくなるからです。
(defun make-add (n) (function (lambda (m) (+ n m)))) ; 関数を返す make-add (fset 'add2 (make-add 2)) ; 関数add2
を ;(make-add 2)
を使って定義する (lambda (m) (+ n m)) (add2 4) ; 4に2を加算してみる error--> Symbol's value as variable is void: n
Lispの方言のいくつかには『クロージャ』(closure)があります。 それは関数のようなオブジェクトですが、追加の変数束縛を記録します。 Emacs Lispにはクロージャはありません。