(defun reassign (val)
(setq val 10))
(reassign s)
При вызове (reassign s)
значение s
передается в reassign
, где оно локально связано с val
.В вашем случае это будет nil
, если вы уже объявили s
с DEFVAR
перед тем, как установить его на ()
(см. setq и defvar в Лиспе ).
Внутри reassign
вызов SETQ
изменяет локальную привязку.
Глобальная привязка
Каждый символ может содержать глобальное значение.Если вы хотите изменить ячейку значения символа, используйте метод доступа SYMBOL-VALUE
:
(setf (symbol-value 's) 10)
Обратите внимание, как указывается s
.Вы изменяете не символ, в настоящее время связанный с s
(который будет nil
, постоянная переменная), а сам символ s
.(SETF SYMBOL)
похоже на прямой вызов SET
.
Лексическое и динамическое связывание
Если, однако, вы хотите изменить place и, в частности, привязки лексических и динамических переменных, необходимо определить макрос:
(defmacro reassign (place)
`(setf ,place 10))
SETF
расширяется до кода, необходимого для обновления места.Вы также можете указать (gethash key table)
вместо переменной без кавычек, которая затем обновит содержимое таблицы.
В случае локальных переменных код, который вызывает reassign
в конечном итоге расширится до вызова специального оператора SETQ
, который знает, как изменить лексические привязки (он также обрабатывает SYMBOL-MACROLET
привязок).