Определение глобальных переменных
Определение переменной — это конструкция, объявляющая о вашем намерении использовать символ в качестве глобальной переменной. Для этого используются специальные формы defvar или defconst, описанные ниже.
Определение переменной служит трём целям. Во-первых, оно сообщает читателям кода, что символ предназначен для определённого использования (в качестве переменной). Во-вторых, оно сообщает об этом системе Lisp и, при необходимости, предоставляет начальное значение и строку документации. В-третьих, оно предоставляет информацию инструментам программирования, таким как etags, позволяя им найти место, где была определена переменная.
Различие между defconst и defvar заключается главным образом в намерении: оно сообщает читателям, может ли значение когда-либо измениться. Emacs Lisp фактически не запрещает изменять значение переменной, определённой с помощью defconst. Одно заметное различие между этими двумя формами состоит в том, что defconst безусловно инициализирует переменную, тогда как defvar инициализирует её, только если изначально она не имеет значения.
Для определения настраиваемой переменной следует использовать defcustom (которая вызывает defvar как подпрограмму). См. Определение переменных настройки.
- Специальная форма: defvar symbol [value [doc-string]]
-
Эта специальная форма определяет symbol как переменную и, при необходимости, инициализирует её и добавляет к ней документацию. Обратите внимание: она не вычисляет symbol; определяемый символ должен быть явно указан в форме
defvar.defvarтакже помечает symbol как специальную, то есть её связывания всегда должны быть динамическими (см. Правила области видимости для связываний переменных).Если задано value и symbol не имеет значения (то есть у него нет динамически связанного значения; см. Когда переменная не имеет значения), то
defvarвычисляет value и инициализирует symbol, присваивая ему результат вычисления. Но если symbol имеет значение,defvarне вычисляет value и оставляет значение symbol без изменений. Если value не задано,defvarни при каких обстоятельствах не изменяет значение symbol.Обратите внимание: указание значения, даже
nil, навсегда помечает переменную как специальную. Если же value не задано,defvarпомечает переменную как специальную только локально (то есть в пределах текущей лексической области видимости или текущего файла, еслиdefvarнаходится на верхнем уровне). Это может быть полезно для подавления предупреждений байт-компилятора; см. Ошибки компилятора.Если symbol имеет привязку к буферу в текущем буфере и задано value,
defvarизменяет значение по умолчанию для symbol, которое не зависит от буфера, а не привязку к буферу. Значение по умолчанию устанавливается, если оно не задано. См. Переменные, локальные для буфера.Если symbol уже связано формой let (например, если форма
defvarнаходится внутри формыlet),defvarзадаёт значение по умолчанию для symbol на верхнем уровне, как иset-default-toplevel-value. Связывание let остаётся в силе до завершения связывающей конструкции. См. Правила области видимости для связываний переменных.Когда вы вычисляете форму
defvarверхнего уровня с помощью C-M-x (eval-defun) или C-x C-e (eval-last-sexp) в режиме Emacs Lisp, специальная возможность этих двух команд устанавливает переменную безусловно, не проверяя, не имеет ли она значения.Если указан аргумент doc-string, он задаёт строку документации переменной (хранящуюся в свойстве символа
variable-documentation). См. Документация.Вот несколько примеров. Эта форма определяет
foo, но не инициализирует её:(defvar foo) ⇒ fooВ этом примере значение
barинициализируется значением23, а также задаётся строка документации:(defvar bar 23 "The normal weight of a bar.") ⇒ barФорма
defvarвозвращает symbol, но обычно используется на верхнем уровне файла, где её значение не имеет значения.Более подробный пример использования
defvarбез значения см. в разделе Пример локального defvar.
- Специальная форма: defconst symbol value [doc-string]
-
Эта специальная форма определяет symbol как значение и инициализирует его. Она сообщает читателю вашего кода, что у symbol есть стандартное глобальное значение, заданное здесь, которое не следует изменять ни пользователю, ни другим программам. Обратите внимание: symbol не вычисляется; определяемый символ должен быть явно указан в
defconst.Форма
defconst, как иdefvar, помечает переменную как специальную, то есть она всегда должна связываться динамически (см. Правила области видимости для связываний переменных). Кроме того, она помечает переменную как рискованную (см. Переменные, локальные для файла).defconstвсегда вычисляет value и присваивает symbol результат вычисления. Если symbol имеет привязку к буферу в текущем буфере,defconstзадаёт значение по умолчанию, а не значение, локальное для буфера. (Но не следует создавать привязки к буферу для символа, определённого с помощьюdefconst.)Пример использования
defconst— определение в Emacs символаfloat-pi— математической константы pi, которую никто не должен изменять (несмотря на попытки законодательного собрания штата Индиана). Однако, как показывает вторая форма,defconstносит лишь рекомендательный характер.(defconst float-pi 3.141592653589793 "The value of Pi.") ⇒ float-pi(setq float-pi 3) ⇒ float-pifloat-pi ⇒ 3
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/Defining-Variables.html