Spec-Zone.ru › Elisp

Использование лексической привязки

При загрузке файла 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 of x will be dynamic within this let.
  (let ((x -99))  ; This is a dynamic binding of x.
    (defun get-dynamic-x ()
      x)))

(let ((x 'lexical)) ; This is a lexical binding of x.
  (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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API