Глобальное значение переменной с локальными привязками буфера также называется значением по умолчанию, поскольку это значение, которое действует всякий раз, когда текущий буфер не имеет собственной привязки для этой переменной.
Функции default-value и setq-default
получают и изменяют значение по умолчанию переменной независимо от того,
имеет ли текущий буфер локальную привязку. Например, вы можете использовать
setq-default, чтобы изменить настройку по умолчанию для
paragraph-start для большинства буферов; и это сработает,
даже если вы находитесь в буфере режима C или Lisp, который имеет локальное
значение для этой переменной.
Специальные формы defvar и defconst
также устанавливают значение по умолчанию (если они устанавливают переменную),
а не какое-либо локальное значение буфера.
Эта функция возвращает значение по умолчанию для symbol.
Это значение, которое наблюдается в буферах и фреймах, не имеющих своих
значений для этой переменной. Если symbol не является
локальным для буфера, это эквивалентно symbol-value (см.
Получение значений переменных).
Функция default-boundp сообщает, является ли
значение по умолчанию для symbol непустым. Если
(default-boundp 'foo) возвращает nil, то
(default-value 'foo) вызовет ошибку.
default-boundp подобна default-value, как
boundp подобна symbol-value.
Эта специальная форма присваивает каждой 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
Эта функция похожа на setq-default, за исключением того, что symbol
является обычным вычисляемым аргументом.
(set-default (car '(a b c)) 23)
⇒ 23
(default-value 'a)
⇒ 23
Переменной можно присвоить значение с помощью локальных переменных.
Это затеняет ее глобальное значение; default-value затем вернет значение из этой
привязки, а не глобальное значение, и set-default будет предотвращен от
установки глобального значения (он изменит значение, привязанное с помощью let).
Следующие две функции позволяют ссылаться на глобальное значение, даже если оно затеняется
привязкой let.
Эта функция возвращает глобальное значение по умолчанию для 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
Эта функция устанавливает глобальное значение по умолчанию для symbol в указанное value. Это удобно, когда вы хотите установить глобальное значение symbol, независимо от того, выполняется ли ваш код в контексте привязки let для symbol.