次: , 前: Scope, 上: Variable Scoping


10.9.2 存続期間

存続期間(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にはクロージャはありません。