Spec-Zone.ru › Elisp

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

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

Функции 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 является буферно-локальной переменной для текущего буфера, эта форма изменяет значение, которое будут видеть другие буферы (если у них нет буферно-локального значения), но не значение, которое видит текущий буфер.

;; In buffer ‘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
;; In (the new) buffer ‘bar’:
buffer-local
     ⇒ new-default
(default-value 'buffer-local)
     ⇒ new-default
(setq buffer-local 'another-default)
     ⇒ another-default
(default-value 'buffer-local)
     ⇒ another-default
;; Back in buffer ‘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

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

Буферно-локальное значение переменной также может быть затенено let-привязкой. Две функции позволяют получать и задавать буферно-локальное значение переменной верхнего уровня, то есть значение вне let-привязки.

Функция: buffer-local-toplevel-value symbol &optional buffer

Эта функция возвращает локальное значение symbol в buffer (по умолчанию — в текущем буфере) вне любой let-привязки. Если symbol не является локальной переменной в buffer, функция сигнализирует об ошибке.

Функция: set-buffer-local-toplevel-value symbol value &optional buffer

Эта функция задаёт локальное значение symbol равным value в buffer (по умолчанию — в текущем буфере) вне любой let-привязки.

Если symbol ещё не является локальной переменной в buffer, она становится локальной. Для глобальных переменных это означает, что у symbol будет отдельное значение в buffer; для переменных, которые автоматически становятся буферно-локальными, эта функция создаёт для них локальное значение в buffer. Если symbol является постоянно буферно-локальной переменной, value будет сохраняться как буферно-локальное значение переменной при смене основного режима.

Это полезно, когда нужно изменить буферно-локальное значение так, чтобы оно сохранилось после завершения выполняемой команды, а код может выполняться, пока эта переменная связана через let-привязку. В этом случае обычный способ задания буферно-локальных значений с помощью setq-local изменит только значение внутри let-привязки, а не лежащее в основе буферно-локальное значение. Эта функция задаёт последнее.

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/Default-Value.html

Spec-Zone.ru

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