Макрос setf
Макрос setf — это наиболее базовый способ работы с обобщенными переменными. Форма setf похожа на setq, за исключением того, что она принимает произвольные формы места слева, а не только символы. Например, (setf (car a) b) устанавливает голову списка a в значение b, выполняя ту же операцию, что и (setcar a b), но без необходимости использования двух отдельных функций для установки и доступа к этому типу места.
- Макрос: setf [форма места]…
Этот макрос вычисляет form и сохраняет его в place, который должен быть допустимой формой обобщенной переменной. Если есть несколько пар place и form, назначения выполняются последовательно, как и в случае с
setq.setfвозвращает значение последней form.
Следующие формы Lisp являются формами в Emacs, которые будут работать как обобщенные переменные и, следовательно, могут появляться в аргументе place макроса setf:
- Символ. Другими словами,
(setf x y)точно эквивалентно(setq x y), аsetqсамо по себе строго говоря избыточно, учитывая, чтоsetfсуществует. Большинство программистов по-прежнему будут предпочитатьsetqдля установки простых переменных, однако, по стилистическим и историческим причинам. Макрос(setf x y)фактически расширяется до(setq x y), поэтому нет штрафа за производительность при использовании в скомпилированном коде. - Вызов любой из следующих стандартных функций Lisp:
aref cddr symbol-function car elt symbol-plist caar get symbol-value cadr gethash cdr nth cdar nthcdr
- Вызов любой из следующих функций, специфичных для Emacs:
alist-get process-get frame-parameter process-sentinel terminal-parameter window-buffer keymap-parent window-display-table match-data window-dedicated-p overlay-get window-hscroll overlay-start window-parameter overlay-end window-point process-buffer window-start process-filter default-value
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.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Setting-Generalized-Variables.html