Использование лексической привязки
При загрузке файла Emacs Lisp или оценке буфера Lisp лексическая привязка включена, если локальная переменная буфера lexical-binding не nil:
- Переменная: lexical-binding
Если эта локальная переменная буфера не
nil, файлы и буферы Emacs Lisp оцениваются с использованием лексической привязки вместо динамической привязки. (Однако специальные переменные всё ещё привязаны динамически; см. ниже.) Еслиnil, динамическая привязка используется для всех локальных переменных. Эта переменная обычно устанавливается для всего файла Emacs Lisp как переменная файла (см. Локальные переменные файла). Обратите внимание, что в отличие от других таких переменных, эта должна быть установлена в первой строке файла.
При непосредственной оценке кода Emacs Lisp с помощью вызова eval, лексическая привязка включена, если аргумент lexical для eval не nil. См. Оценивание.
Лексическая привязка также включена в режиме взаимодействия с Lisp и режиме IELM, используемом в буферах *scratch* и *ielm*, а также при оценке выражений через M- (eval-expression) и при обработке командной строки параметров --eval Emacs (см. Аргументы действий в Руководстве GNU Emacs) и emacsclient (см. Параметры emacsclient в Руководстве GNU Emacs).
Даже когда лексическая привязка включена, некоторые переменные продолжат использовать динамическую привязку. Они называются специальными переменными. Любая переменная, которая была определена с помощью defvar, defcustom или defconst, является специальной переменной (см. Определение переменных). Все остальные переменные подчиняются лексической привязке.
Использование defvar без значения позволяет динамически привязать переменную только в одном файле или только в одной части файла, при этом по-прежнему связывая её лексически в других местах. Например:
(let (_) (defvar x) ; Let-bindings ofxwill be dynamic within this let. (let ((x -99)) ; This is a dynamic binding ofx. (defun get-dynamic-x () x))) (let ((x 'lexical)) ; This is a lexical binding ofx. (defun get-lexical-x () x)) (let (_) (defvar x) (let ((x 'dynamic)) (list (get-lexical-x) (get-dynamic-x)))) ⇒ (lexical dynamic)
- Функция: special-variable-p символ
-
Эта функция возвращает не-
nil, если символ является специальной переменной (т.е. он имеет определение переменнойdefvar,defcustom, илиdefconst). В противном случае возвращаемое значение равноnil.Обратите внимание, что поскольку это функция, она может вернуть не-
nilтолько для переменных, которые постоянно являются специальными, но не для тех, которые являются специальными только в текущем лексическом пространстве имён.
Использование специальной переменной в качестве формального аргумента в функции не поддерживается.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Lexical-Binding.html