Next: オープンクロージャ, 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界を晒け出すものだと言えます。この理由により、クロージャオブジェクトの構造を直接調べたり変更することは推奨しません。