Динамическое связывание
По умолчанию, локальные привязки переменных в Emacs являются динамическими. Когда переменная динамически связана, её текущая привязка в любой момент выполнения программы Lisp — это просто самая последняя созданная динамическая локальная привязка для этого символа или глобальная привязка, если такой локальной привязки нет.
Динамические привязки имеют динамический объем и срок действия, как показано в следующем примере:
(defvar x -99) ;xreceives an initial value of -99. (defun getx () x) ;xis used free in this function. (let ((x 1)) ;xis dynamically bound. (getx)) ⇒ 1 ;; After theletform finishes,xreverts to its ;; previous value, which is -99. (getx) ⇒ -99
Функция getx ссылается на x. Это свободная ссылка в том смысле, что нет привязки для x внутри этого defun блока. Когда мы вызываем getx изнутри let формы, в которой x (динамически) привязана, она получает локальное значение (т.е. 1). Но когда мы вызываем getx вне let формы, она получает глобальное значение (т.е. -99).
Вот ещё один пример, который иллюстрирует установку динамически связанной переменной с помощью setq:
(defvar x -99) ;xreceives an initial value of -99. (defun addx () (setq x (1+ x))) ; Add 1 toxand return its new value. (let ((x 1)) (addx) (addx)) ⇒ 3 ; The twoaddxcalls add toxtwice. ;; After theletform finishes,xreverts to its ;; previous value, which is -99. (addx) ⇒ -98
Динамическое связывание реализовано в Emacs Lisp простым способом. Каждый символ имеет ячейку значения, которая определяет его текущее динамическое значение (или отсутствие значения). См. Компоненты символов. Когда символу дается динамическая локальная привязка, Emacs записывает содержимое ячейки значения (или её отсутствие) в стек и сохраняет новое локальное значение в ячейке значения. Когда блок привязки завершает выполнение, Emacs извлекает старое значение из стека и помещает его в ячейку значения.
Обратите внимание, что при нативном компиляции кода, использующего динамическое связывание, нативный компилятор не будет выполнять какие-либо специфические для Lisp оптимизации.
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/Dynamic-Binding.html