12.17.1 Макрос setf

Макрос setf — самый базовый способ работы с обобщенными переменными. Форма setf похожа на setq, за исключением того, что она принимает произвольные формы места в первом (левом) аргументе каждой пары, а не только символы. Например, (setf (car a) b) устанавливает car a в b, выполняя ту же операцию, что и (setcar a b), но без необходимости использовать две отдельные функции для установки и доступа к такому месту.

Макрос: setf [форма места]…

Этот макрос вычисляет form и сохраняет его значение в place, которое должно быть допустимой формой обобщенной переменной. Если существует несколько пар place и form, присваивания выполняются последовательно, как и с setq. setf возвращает значение последней form.

Следующие формы Lisp — это формы в Emacs, которые будут работать как обобщенные переменные, и поэтому могут появляться в аргументе place setf:

setf сигнализирует об ошибке, если вы передаете форму place, которую он не знает, как обработать.

Обратите внимание, что для nthcdr аргумент списка функции сам должен быть допустимой формой place. Например, (setf (nthcdr 0 foo) 7) установит саму foo в 7.

Макросы push (см. Изменение переменных списка) и pop (см. Доступ к элементам списков) могут манипулировать обобщенными переменными, а не только списками. (pop place) удаляет и возвращает первый элемент списка, хранящегося в place. Это аналогично (prog1 (car place) (setf place (cdr place))), за исключением того, что он гарантирует вычисление всех подформ только один раз. (push x place) вставляет x в начало списка, хранящегося в place. Это аналогично (setf place (cons x place)), за исключением вычисления подформ. Обратите внимание, что push и pop для места nthcdr могут использоваться для вставки или удаления в любой позиции в списке.

Библиотека cl-lib определяет различные расширения для обобщенных переменных, включая дополнительные места setf. См. Обобщенные переменные в Расширения Common Lisp.