Когда переменная не имеет значения
Переменная не имеет значения, если у её символа нет присвоенного значения в ячейке значения (см. Компоненты символа).
При использовании правила динамической области видимости, действующего в 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 outerletbinding 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