Как объясняется в Правила области видимости при связывании переменных, Emacs может опционально включить
лексическое связывание переменных. Когда лексическое связывание включено, любая
именованная функция, которую вы создаете (например, с помощью defun), а также
любая анонимная функция, созданная с помощью макроса lambda
или специальной формы function или синтаксиса #'
(см. Анонимные функции), автоматически преобразуется в
закрытие.
Закрытие — это функция, которая также несет запись лексической среды, существовавшей во время определения функции. При вызове она использует сохраненную лексическую среду для любых ссылок на лексические переменные в ее определении. Во всех других отношениях закрытия ведут себя очень похоже на обычные функции; в частности, их можно вызывать так же, как и обычные функции.
См. Лексическое связывание, для примера использования закрытия.
В настоящее время объект закрытия Emacs Lisp представляется списком,
где первым элементом является символ closure, вторым элементом — список,
представляющий лексическую среду, а оставшиеся элементы — формы списка аргументов и тела:
;; лексическое связывание включено.
(lambda (x) (* x x))
⇒ #f(lambda (x) [t] (* x x))
Однако тот факт, что внутренняя структура закрытия раскрыта остальной части мира Lisp, считается внутренней деталью реализации. По этой причине мы не рекомендуем напрямую исследовать или изменять структуру объектов закрытия.