Задание значений переменных
Обычно значение переменной изменяют с помощью специальной формы setq. Если во время выполнения нужно вычислить, какую переменную изменить, используйте функцию set.
- Специальная форма: setq [symbol form]…
-
Эта специальная форма — самый распространённый способ изменить значение переменной. Каждому symbol присваивается новое значение, которое является результатом вычисления соответствующего form. Текущее связывание символа изменяется.
setqне вычисляет symbol; она устанавливает символ, который вы указываете. Говорят, что этот аргумент автоматически заключается в кавычки. Буква «q» вsetqозначает «заключённый в кавычки».Значением формы
setqявляется значение последнего form.(setq x (1+ 2)) ⇒ 3x ;xnow has a global value. ⇒ 3(let ((x 5)) (setq x 6) ; The local binding ofxis set. x) ⇒ 6x ; The global value is unchanged. ⇒ 3Обратите внимание: сначала вычисляется первый form, затем устанавливается первый symbol, затем вычисляется второй form, затем устанавливается второй symbol и так далее:
(setq x 10 ; Notice that
xis set before y (1+ x)) ; the value ofyis 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) ;twoevaluates to symbolone. ⇒ 2one ; So it is
onethat was set. ⇒ 2 (let ((one 1)) ; This binding ofoneis set, (set 'one 3) ; not the global value. one) ⇒ 3one ⇒ 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