Spec-Zone.ru › Elisp

Когда переменная не имеет значения

Переменная не имеет значения, если у её символа нет присвоенного значения в ячейке значения (см. Компоненты символа).

При использовании правила динамической области видимости, действующего в Emacs Lisp по умолчанию (см. Правила области видимости для привязок переменных), в ячейке значения хранится текущее (локальное или глобальное) значение переменной. Обратите внимание: ячейка значения без присвоенного значения — это не то же самое, что наличие nil в ячейке значения. Символ nil — это объект Lisp, который может быть значением переменной, как и любой другой объект; но это всё равно значение. Если переменная не имеет значения, попытка вычислить её приводит к ошибке void-variable вместо возврата значения.

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

Функция: makunbound symbol

Эта функция очищает ячейку значения symbol, делая переменную не имеющей значения. Она возвращает symbol.

Если применить её к псевдониму переменной (см. Псевдонимы переменных), она сначала отсоединяет переменную от её псевдонима, тем самым отменяя действие defvaralias.

Если для symbol действует динамическая локальная привязка, makunbound делает текущую привязку не имеющей значения, и это состояние сохраняется лишь до тех пор, пока действует локальная привязка. После этого вновь становится доступна ранее затенённая локальная или глобальная привязка; тогда переменная больше не будет не иметь значения, если только вновь доступная привязка тоже не окажется без значения.

Ниже приведены примеры (предполагается, что действует динамическая привязка):

(setq x 1)               ; Put a value in the global binding.
     ⇒ 1
(let ((x 2))             ; Locally bind it.
  (makunbound 'x)        ; Void the local binding.
  x)
error→ Symbol's value as variable is void: x
x                        ; The global binding is unchanged.
     ⇒ 1

(let ((x 2))             ; Locally bind it.
  (let ((x 3))           ; And again.
    (makunbound 'x)      ; Void the innermost-local binding.
    x))                  ; And refer: it’s void.
error→ Symbol's value as variable is void: x
(let ((x 2))
  (let ((x 3))
    (makunbound 'x))     ; Void inner binding, then remove it.
  x)                     ; Now outer let binding is visible.
     ⇒ 2
Функция: boundp variable

Эта функция возвращает t, если variable (символ) имеет значение, и nil, если не имеет.

Ниже приведены примеры (предполагается, что действует динамическая привязка):

(boundp 'abracadabra)          ; Starts out void.
     ⇒ nil
(let ((abracadabra 5))         ; Locally bind it.
  (boundp 'abracadabra))
     ⇒ t
(boundp 'abracadabra)          ; Still globally void.
     ⇒ nil
(setq abracadabra 5)           ; Make it globally nonvoid.
     ⇒ 5
(boundp 'abracadabra)
     ⇒ t

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Void-Variables.html

Spec-Zone.ru

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