12.4 Когда переменная пуста

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

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

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

Функция: makunbound symbol

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

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

Вот несколько примеров (при условии, что действует динамическая привязка):

(setq x 1)               ; Поместить значение в глобальную привязку.
     ⇒ 1
(let ((x 2))             ; Локально привязать ее.
  (makunbound 'x)        ; Аннулировать локальную привязку.
  x)
error→ Символ не имеет значения переменной: x
x                        ; Глобальная привязка не изменена.
     ⇒ 1

(let ((x 2))             ; Локально привязать ее.
  (let ((x 3))           ; И снова.
    (makunbound 'x)      ; Аннулировать внутреннюю локальную привязку.
    x))                  ; И обратиться: она пуста.
error→ Символ не имеет значения переменной: x

(let ((x 2))
  (let ((x 3))
    (makunbound 'x))     ; Аннулировать внутреннюю привязку, затем удалить ее.
  x)                     ; Теперь видна внешняя привязка let.
     ⇒ 2
Функция: boundp variable

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

Вот несколько примеров (при условии, что действует динамическая привязка):

(boundp 'abracadabra)          ; Изначально пуст.
     ⇒ nil
(let ((abracadabra 5))         ; Локально привязать его.
  (boundp 'abracadabra))
     ⇒ t
(boundp 'abracadabra)          ; Все еще глобально пуст.
     ⇒ nil
(setq abracadabra 5)           ; Сделать его глобально непустым.
     ⇒ 5
(boundp 'abracadabra)
     ⇒ t