12.8 Установка значений переменных

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

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

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

setq не вычисляет символ; он устанавливает символ, который вы вводите. Мы говорим, что этот аргумент автоматически заключается в кавычки. Знак ‘q’ в setq означает “заключен в кавычки”.

Значение формы setq — это значение последней формы.

(setq x (1+ 2))
     ⇒ 3
x                   ; x теперь имеет глобальное значение.
     ⇒ 3
(let ((x 5))
  (setq x 6)        ; Локальное связывание x установлено.
  x)
     ⇒ 6
x                   ; Глобальное значение не изменено.
     ⇒ 3

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

(setq x 10          ; Обратите внимание, что x устанавливается до
      y (1+ x))     ;   вычисляется значение y.
     ⇒ 11
Функция: set символ значение

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

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

(set one 1)
error→ Значение символа как переменной пусто: one
(set 'one 1)
     ⇒ 1
(set 'two 'one)
     ⇒ one
(set two 2)         ; two вычисляется в символ one.
     ⇒ 2
one                 ; Таким образом, установлено one.
     ⇒ 2
(let ((one 1))      ; Это связывание one установлено,
  (set 'one 3)      ;   а не глобальное значение.
  one)
     ⇒ 3
one
     ⇒ 2

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

(set '(x y) 'z)
error→ Неверный аргумент типа: symbolp, (x y)
Макрос: setopt [символ форма]…

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

(defcustom my-var 1
  "Моя переменная."
  :type 'number
  :set (lambda (var val)
         (set-default var val)
         (message "Мы установили %s в %s" var val)))

то после этого, в дополнение к установке my-var в ‘2’, также будет выведено сообщение:

(setopt my-var 2)

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

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

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