(defmacro sortf (op &rest places)
(let* ((meths (loop for p in places
collect (multiple-value-list
(get-setf-expansion p))))
(temps (apply #'append (mapcar #'third meths))))
`(let* ,(mapcar #'list
(mapcan (lambda (m)
(append (first m)
(third m)))
meths)
(mapcan (lambda (m)
(append (second m)
(list (fifth m))))
meths))
,@(mapcon (lambda (rest)
(mapcar (lambda (arg)
`(unless (,op ,(car rest) ,arg)
(rotatef ,(car rest) ,arg)))
(cdr rest)))
temps)
,@(mapcar #'fourth meths))))Source Context