Spec-Zone.ru › Elisp

Задание значений переменных

Обычно значение переменной изменяют с помощью специальной формы setq. Если во время выполнения нужно вычислить, какую переменную изменить, используйте функцию set.

Специальная форма: setq [symbol form]…

Эта специальная форма — самый распространённый способ изменить значение переменной. Каждому symbol присваивается новое значение, которое является результатом вычисления соответствующего form. Текущее связывание символа изменяется.

setq не вычисляет symbol; она устанавливает символ, который вы указываете. Говорят, что этот аргумент автоматически заключается в кавычки. Буква «q» в setq означает «заключённый в кавычки».

Значением формы setq является значение последнего form.

(setq x (1+ 2))
     ⇒ 3
x                   ; x now has a global value.
     ⇒ 3
(let ((x 5))
  (setq x 6)        ; The local binding of x is set.
  x)
     ⇒ 6
x                   ; The global value is unchanged.
     ⇒ 3

Обратите внимание: сначала вычисляется первый form, затем устанавливается первый symbol, затем вычисляется второй form, затем устанавливается второй symbol и так далее:

(setq x 10          ; Notice that x is set before
      y (1+ x))     ;   the value of y is computed.
     ⇒ 11
Функция: set symbol value

Эта функция помещает value в ячейку значения symbol. Поскольку это функция, а не специальная форма, выражение, записанное для symbol, вычисляется, чтобы получить символ, значение которого нужно установить. Возвращаемое значение — value.

Когда действует динамическое связывание переменных (по умолчанию), set имеет тот же эффект, что и setq, за исключением того, что set вычисляет аргумент symbol, а setq — нет. Но если переменная связана лексически, set воздействует на её динамическое значение, тогда как setq воздействует на её текущее (лексическое) значение. См. Правила области видимости для связываний переменных.

(set one 1)
error→ Symbol's value as variable is void: one
(set 'one 1)
     ⇒ 1
(set 'two 'one)
     ⇒ one
(set two 2)         ; two evaluates to symbol one.
     ⇒ 2
one                 ; So it is one that was set.
     ⇒ 2
(let ((one 1))      ; This binding of one is set,
  (set 'one 3)      ;   not the global value.
  one)
     ⇒ 3
one
     ⇒ 2

Если symbol на самом деле не является символом, возникает ошибка wrong-type-argument.

(set '(x y) 'z)
error→ Wrong type argument: symbolp, (x y)
Макрос: setopt [symbol form]…

Он похож на setq (см. выше), но предназначен для пользовательских параметров. Этот макрос использует механизм Customize для установки переменной (или переменных) (см. Определение настраиваемых переменных). В частности, setopt вызовет функцию установки, связанную с переменной. Например, если у вас есть:

(defcustom my-var 1
  "My var."
  :type 'number
  :set (lambda (var val)
         (set-default var val)
         (message "We set %s to %s" var val)))

то следующая команда не только установит для my-var значение «2», но и выведет сообщение:

(setopt my-var 2)

setopt также проверяет, допустимо ли значение для пользовательского параметра. Например, попытка с помощью setopt присвоить строку пользовательскому параметру, определённому с типом number, вызовет ошибку.

В отличие от defcustom и связанных с ним команд настройки, таких как customize-variable, setopt предназначен для неинтерактивного использования, в частности в пользовательском init-файле. Поэтому он не записывает стандартное, сохранённое и установленное пользователем значения и не помечает переменную как кандидата для сохранения в файле настроек.

Макрос setopt можно использовать с обычными переменными, не являющимися пользовательскими параметрами, но он значительно менее эффективен, чем setq. Основное назначение этого макроса — задавать пользовательские параметры в пользовательском init-файле.

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/Setting-Variables.html

Spec-Zone.ru

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