12.11.3 Значение по умолчанию локальной переменной буфера

Глобальное значение переменной с локальными привязками буфера также называется значением по умолчанию, поскольку это значение, которое действует всякий раз, когда текущий буфер не имеет собственной привязки для этой переменной.

Функции default-value и setq-default получают и изменяют значение по умолчанию переменной независимо от того, имеет ли текущий буфер локальную привязку. Например, вы можете использовать setq-default, чтобы изменить настройку по умолчанию для paragraph-start для большинства буферов; и это сработает, даже если вы находитесь в буфере режима C или Lisp, который имеет локальное значение для этой переменной.

Специальные формы defvar и defconst также устанавливают значение по умолчанию (если они устанавливают переменную), а не какое-либо локальное значение буфера.

Функция: default-value symbol

Эта функция возвращает значение по умолчанию для symbol. Это значение, которое наблюдается в буферах и фреймах, не имеющих своих значений для этой переменной. Если symbol не является локальным для буфера, это эквивалентно symbol-value (см. Получение значений переменных).

Функция: default-boundp symbol

Функция default-boundp сообщает, является ли значение по умолчанию для symbol непустым. Если (default-boundp 'foo) возвращает nil, то (default-value 'foo) вызовет ошибку.

default-boundp подобна default-value, как boundp подобна symbol-value.

Специальная форма: setq-default [symbol form]…

Эта специальная форма присваивает каждой symbol новое значение по умолчанию, которое является результатом вычисления соответствующей form. Она не вычисляет symbol, но вычисляет form. Значение формы setq-default — это значение последней form.

Если symbol не является локальным для буфера текущего буфера и не помечен автоматически как локальный для буфера, setq-default имеет тот же эффект, что и setq. Если symbol является локальным для текущего буфера, то это изменяет значение, которое увидят другие буферы (если у них нет локального значения), но не значение, которое видит текущий буфер.

;; В буфере ‘foo’:
(make-local-variable 'buffer-local)
     ⇒ buffer-local
(setq buffer-local 'value-in-foo)
     ⇒ value-in-foo
(setq-default buffer-local 'new-default)
     ⇒ new-default
buffer-local
     ⇒ value-in-foo
(default-value 'buffer-local)
     ⇒ new-default

;; В (новом) буфере ‘bar’:
buffer-local
     ⇒ new-default
(default-value 'buffer-local)
     ⇒ new-default
(setq buffer-local 'another-default)
     ⇒ another-default
(default-value 'buffer-local)
     ⇒ another-default

;; Обратно в буфере ‘foo’:
buffer-local
     ⇒ value-in-foo
(default-value 'buffer-local)
     ⇒ another-default
Функция: set-default symbol value

Эта функция похожа на setq-default, за исключением того, что symbol является обычным вычисляемым аргументом.

(set-default (car '(a b c)) 23)
     ⇒ 23
(default-value 'a)
     ⇒ 23

Переменной можно присвоить значение с помощью локальных переменных. Это затеняет ее глобальное значение; default-value затем вернет значение из этой привязки, а не глобальное значение, и set-default будет предотвращен от установки глобального значения (он изменит значение, привязанное с помощью let). Следующие две функции позволяют ссылаться на глобальное значение, даже если оно затеняется привязкой let.

Функция: default-toplevel-value symbol

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

(defvar variable 'global-value)
    ⇒ variable
(let ((variable 'let-binding))
  (default-value 'variable))
    ⇒ let-binding
(let ((variable 'let-binding))
  (default-toplevel-value 'variable))
    ⇒ global-value
Функция: set-default-toplevel-value symbol value

Эта функция устанавливает глобальное значение по умолчанию для symbol в указанное value. Это удобно, когда вы хотите установить глобальное значение symbol, независимо от того, выполняется ли ваш код в контексте привязки let для symbol.