. , , . .
. -, push - , setf. , setf getf-string-equal. .
(defsetf getf-string-equal (plist indicator) (value)
(let ((i (gensym))
(rest (gensym))
(match (gensym)))
`(let ((,match (loop
for (,i . ,rest) on ,plist by #'cddr
when (string-equal ,i ,indicator)
return ,rest)))
(if ,match
(setf (car ,match) ,value)
nil))))
. defsetf . plist indicator - , , value - . ; . . gensym .
, , . , cons, . , car , . , , .
, . cons , car. if. `(setf ,plist ,value), . defsetf , . , , , , define-setf-expander, defsetf. , setf, , , .