define-setf-expander
является наиболее общим из них.Все функциональные возможности setf
охватываются им.
Определение функции setf прекрасно работает для большинства методов доступа.Также допустимо использовать обобщенную функцию, поэтому полиморфизм недостаточен, чтобы требовать использования чего-то другого.Управление оценкой правильности или производительности является основной причиной, по которой не использует функцию setf.
Для правильности многие формы деструктурирования невозможно выполнить с помощью функции setf (например, (setf (values ...) ...)
).Точно так же я видел пример, в котором функциональные структуры данных ведут себя локально, как изменяемые, изменяя (setf (dict-get key some-dict) 2)
, чтобы назначить новый словарь для some-dict
.
Для производительности рассмотрим глупый случай (incf (nth 10000 list))
который, если бы писатель nth
был реализован как функция, потребовал бы обхода узлов списка 10k дважды, но в расширителе setf это можно сделать за один проход.