Spec-Zone.ru › Elisp

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

Определение переменной — это конструкция, объявляющая о вашем намерении использовать символ в качестве глобальной переменной. Для этого используются специальные формы 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-pi
float-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

Spec-Zone.ru

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