Next: Emacs Lisp関数にたいするアドバイス, Previous: 関数セルの内容へのアクセス, Up: 関数 [Contents][Index]
変数のバインディングのスコーピングルールで説明したように、Emacsはオプションで変数のレキシカルバインディングを有効にできます。レキシカルバインディングが有効な場合は、(たとえばdefun
などで)作成したすべての名前つき関数、同様にlambda
マクロやfunction
スペシャルフォーム、#'
構文を使用して作成したすべての無名関数(無名関数を参照)が、自動的にクロージャー(closure)に変換されます。
クロージャーとはその関数が定義されたどときに存在したレキシカル環境の記録をあわせもつ関数です。クロージャーが呼び出されたとき、定義内のレキシカル変数の参照には、その保持されたレキシカル環境が使用されます。他のすべての点では、クロージャーは通常の関数と同様に振る舞います。特にクロージャーは通常の関数と同じ方法で呼び出すことができます。
クロージャー使用する例はレキシカルバインディングを参照してください。
現在のところEmacs
Lispのクロージャーオブジェクトは、1つ目の要素にシンボルclosure
をもつリストとして表現されます。そのリストは2つ目の要素としてレキシカル環境、残りの要素で引数リストとbodyフォームを表します:
;; レキシカルバインディングが有効
(lambda (x) (* x x))
⇒ (closure (t) (x) (* x x))
しかし実際にはクロージャーの内部構造は、内部的な実装の詳細と判断される残りのLisp界を晒け出すものだと言えます。この理由により、クロージャーオブジェクトの構造を直接調べたり変更することは推奨しません。