変数バインディングのスコープ規則で説明されている通り、Emacsではオプションで変数のレキシカルバインディングを有効にできます。レキシカルバインディングを有効にすると、作成した任意の名前付き関数(例:defun によるもの)や、lambda マクロ、function 特殊形式、または #' 構文(匿名関数
を参照)を用いて作成した任意の匿名関数が、自動的にクロージャに変換されます。
クロージャとは、関数が定義された時点で存在していた字句環境の記録も保持する関数のことです。呼び出される際、その定義内にある字句変数への参照は、保持された字句環境を使用します。それ以外の点では、クロージャは通常の関数とほぼ同様に動作します。特に、通常の関数と同じ方法で呼び出すことができます。
クロージャの使用例については、レキシカルバインディングを参照してください。
;; lexical binding is enabled.
(lambda (x) (* x x))
⇒ #f(lambda (x) [t] (* x x))
クロージャの内部構造は実装上の事項であり、直接調査したり変更したりすることは推奨されません。詳細については、クロージャ関数オブジェクトを参照してください。