Spec-Zone.ru › Elisp

Динамическое связывание

По умолчанию, локальные привязки переменных в Emacs являются динамическими. Когда переменная динамически связана, её текущая привязка в любой момент выполнения программы Lisp — это просто самая последняя созданная динамическая локальная привязка для этого символа или глобальная привязка, если такой локальной привязки нет.

Динамические привязки имеют динамический объем и срок действия, как показано в следующем примере:

(defvar x -99)  ; x receives an initial value of -99.

(defun getx ()
  x)            ; x is used free in this function.

(let ((x 1))    ; x is dynamically bound.
  (getx))
     ⇒ 1

;; After the let form finishes, x reverts to its
;; previous value, which is -99.

(getx)
     ⇒ -99

Функция getx ссылается на x. Это свободная ссылка в том смысле, что нет привязки для x внутри этого defun блока. Когда мы вызываем getx изнутри let формы, в которой x (динамически) привязана, она получает локальное значение (т.е. 1). Но когда мы вызываем getx вне let формы, она получает глобальное значение (т.е. -99).

Вот ещё один пример, который иллюстрирует установку динамически связанной переменной с помощью setq:

(defvar x -99)      ; x receives an initial value of -99.

(defun addx ()
  (setq x (1+ x)))  ; Add 1 to x and return its new value.

(let ((x 1))
  (addx)
  (addx))
     ⇒ 3           ; The two addx calls add to x twice.

;; After the let form finishes, x reverts 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

Spec-Zone.ru

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