12.10 Правила области видимости для привязок переменных

Когда вы создаете локальную привязку для переменной, эта привязка действует только в ограниченной части программы (см. Локальные переменные). В этом разделе подробно описывается, что это означает.

Каждая локальная привязка имеет определенную область видимости (scope) и протяженность (extent). Область видимости относится к тому, где в исходном тексте кода может быть доступна привязка. Протяженность относится к тому, когда, во время выполнения программы, существует эта привязка.

По историческим причинам существует два диалекта Emacs Lisp, выбираемых с помощью буферной локальной переменной lexical-binding. В современном диалекте Emacs Lisp локальные привязки по умолчанию являются лексическими. Лексическая привязка имеет лексическую область видимости, что означает, что любая ссылка на переменную должна находиться в текстовом коде внутри конструктора привязки11. Она также имеет неограниченную протяженность, что означает, что при определенных обстоятельствах привязка может существовать даже после завершения выполнения конструктора привязки, посредством объектов, называемых замыканиями (closures). Лексическая область видимости также часто называется статической областью видимости.

Локальные привязки также могут быть динамическими, что всегда так в старом диалекте Emacs Lisp и опционально в современном диалекте. Динамическая привязка имеет динамическую область видимости, что означает, что любая часть программы потенциально может получить доступ к привязке переменной. Она также имеет динамическую протяженность, что означает, что привязка действует только во время выполнения конструктора привязки (например, тела формы let).

Старый диалект Emacs Lisp, использующий только динамические привязки, по-прежнему является настройкой по умолчанию в коде, загруженном или вычисленном из файлов Lisp, не содержащих объявления диалекта. В конечном итоге современный диалект станет настройкой по умолчанию. Все файлы Lisp должны объявлять используемый диалект, чтобы гарантировать, что они будут корректно работать в будущем.

В следующих подразделах более подробно описываются лексическая и динамическая привязки, а также способы включения лексической привязки в программах Emacs Lisp.


Примечания

(11)

С некоторыми исключениями; например, лексическая привязка также может быть доступна из отладчика Lisp.