13.10 Закрытия

Как объясняется в Правила области видимости при связывании переменных, Emacs может опционально включить лексическое связывание переменных. Когда лексическое связывание включено, любая именованная функция, которую вы создаете (например, с помощью defun), а также любая анонимная функция, созданная с помощью макроса lambda или специальной формы function или синтаксиса #' (см. Анонимные функции), автоматически преобразуется в закрытие.

Закрытие — это функция, которая также несет запись лексической среды, существовавшей во время определения функции. При вызове она использует сохраненную лексическую среду для любых ссылок на лексические переменные в ее определении. Во всех других отношениях закрытия ведут себя очень похоже на обычные функции; в частности, их можно вызывать так же, как и обычные функции.

См. Лексическое связывание, для примера использования закрытия.

В настоящее время объект закрытия Emacs Lisp представляется списком, где первым элементом является символ closure, вторым элементом — список, представляющий лексическую среду, а оставшиеся элементы — формы списка аргументов и тела:

;; лексическое связывание включено.
(lambda (x) (* x x))
     ⇒ #f(lambda (x) [t] (* x x))

Однако тот факт, что внутренняя структура закрытия раскрыта остальной части мира Lisp, считается внутренней деталью реализации. По этой причине мы не рекомендуем напрямую исследовать или изменять структуру объектов закрытия.