- ;; `cl-setf-do-modify' returns a list (LETS STORE FETCH).
- (let ((setf-things (cl-setf-do-modify place (cons 'list keys)))
- (keyfn (gensym "key"))
- (itemvar (gensym "item")))
- `(let ((,keyfn ,key)
- (,itemvar ,item)
- ,@(car setf-things))
- ,(cl-setf-do-store (cadr setf-things)
- `(cons ,itemvar
- (remove* (funcall ,keyfn ,itemvar)
- ,(caddr setf-things)
- :key ,keyfn
- ,@(mdw-remprop-nondestructive
- :key keys)))))))
+ (cond ((fboundp 'cl-callf2)
+ `(cl-callf2 mdw-cons-replace ,item ,place ,@keys))
+ ((fboundp 'cl-setf-do-modify)
+ ;; `cl-setf-do-modify' returns a list (LETS STORE FETCH).
+ (let ((setf-things (cl-setf-do-modify place (cons 'list keys))))
+ `(let (,@(car setf-things))
+ ,(cl-setf-do-store (cadr setf-things)
+ `(mdw-cons-replace ,item ,place
+ ,@keys)))))
+ (t (error "Don't know how to hack places on this Emacs."))))