Spec-Zone.ru › Elisp

Определение глобальных переменных

Определение переменной — это конструкция, которая объявляет ваше намерение использовать символ в качестве глобальной переменной. Она использует специальные формы defvar или defconst, которые описаны ниже.

Определение переменной выполняет три функции. Во-первых, оно информирует читателей кода о том, что символ предназначен для использования определённым образом (как переменная). Во-вторых, оно информирует систему Lisp об этом, при необходимости указывая начальное значение и строку документации. В-третьих, оно предоставляет информацию инструментам программирования, таким как etags, позволяя им найти место определения переменной.

Разница между defconst и defvar в основном заключается в намерении, служащим для информирования человеческих читателей о том, должно ли значение когда-либо меняться. Emacs Lisp фактически не препятствует изменению значения переменной, определённой с помощью defconst. Отличительной особенностью двух форм является то, что defconst безусловно инициализирует переменную, а defvar инициализирует её только если она изначально пуста.

Для определения настраиваемой переменной следует использовать defcustom (которая вызывает defvar как подпрограмму). См. Определения переменных.

Специальная форма: defvar символ [значение [строка документации]]

Эта специальная форма определяет символ как переменную. Обратите внимание, что символ не вычисляется; символ, который должен быть определён, должен быть явно указан в форме defvar. Переменная помечается как специальная, что означает, что она всегда должна быть динамически связана (см. Области действия переменных).

Если значение указано, и символ пуст (т.е., он не имеет динамически связанного значения; см. Пустые переменные), то значение вычисляется, и символ устанавливается в результат. Но если символ не пуст, то значение не вычисляется, а значение символа остаётся неизменным. Если значение опущено, значение символа в любом случае не изменяется.

Обратите внимание, что указание значения, даже nil, навсегда помечает переменную как специальную. В то время как, если значение опущено, переменная помечается как специальная только локально (т.е. в текущей лексической области или файле, если на верхнем уровне). Это может быть полезно для подавления предупреждений о компиляции байт-кода, см. Ошибки компилятора.

Если символ имеет локальную для буфера привязку в текущем буфере, defvar действует на значение по умолчанию, которое независимо от буфера, а не на локальную для буфера привязку. Он устанавливает значение по умолчанию, если значение по умолчанию пустое. См. Переменные, локальные для буфера.

Если символ уже связан лексически (например, если форма defvar встречается в форме let с включенной лексической связью), то defvar устанавливает динамическое значение. Лексическая привязка остаётся в силе до выхода конструкции привязки. См. Области действия переменных.

При оценке формы defvar верхнего уровня с помощью C-M-x (eval-defun) или C-x C-e (eval-last-sexp) в режиме Emacs Lisp, особая функция этих двух команд обеспечивает безусловное установление переменной без проверки, является ли её значение пустым.

Если аргумент строка документации предоставлен, он определяет строку документации для переменной (сохранённую в свойстве variable-documentation символа). См. Документация.

Вот несколько примеров. Эта форма определяет foo, но не инициализирует её:

(defvar foo)
     ⇒ foo

В этом примере значение bar инициализируется значением 23, и ему присваивается строка документации:

(defvar bar 23
  "The normal weight of a bar.")
     ⇒ bar

Форма defvar возвращает символ, но обычно используется на верхнем уровне в файле, где её значение не имеет значения.

Для более подробного примера использования defvar без значения см. Пример локального defvar.

Специальная форма: defconst символ значение [строка документации]

Эта специальная форма определяет символ как значение и инициализирует его. Она информирует читателя кода о том, что символ имеет стандартное глобальное значение, установленное здесь, которое не должно изменяться пользователем или другими программами. Обратите внимание, что символ не вычисляется; символ, который должен быть определён, должен быть явно указан в defconst.

Форма defconst, как и defvar, помечает переменную как специальную, что означает, что она всегда должна быть динамически связана (см. Области действия переменных). Кроме того, она помечает переменную как рискованную (см. Локальные переменные файла).

defconst всегда вычисляет значение и устанавливает значение символа в результат. Если символ имеет привязку локальную для буфера в текущем буфере, defconst устанавливает значение по умолчанию, а не значение, локальное для буфера. (Но вы не должны создавать локальные для буфера привязки для символа, определённого с помощью defconst.)

Пример использования defconst — это определение Emacs’а float-pi, математической константы пи, которую никто не должен изменять (несмотря на попытки законодательного собрания штата Индиана). Однако, как показывает второй пример, defconst — это лишь рекомендация.

(defconst float-pi 3.141592653589793 "The value of Pi.")
     ⇒ float-pi
(setq float-pi 3)
     ⇒ float-pi
float-pi
     ⇒ 3

Предупреждение: Если вы используете специальную форму defconst или defvar, когда переменная имеет локальную привязку (созданную с помощью let, или аргумента функции), она устанавливает локальную привязку, а не глобальную. Это не то, что вы обычно хотите. Чтобы этого избежать, используйте эти специальные формы на верхнем уровне в файле, где обычно нет локальной привязки, и убедитесь, что вы загрузили файл до создания локальной привязки к переменной.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Variables.html

Spec-Zone.ru

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