(define-setf-expander if (test cons alt &environment env) (multiple-value-bind (cons-temp-vars cons-temp-vals cons-store-vars cons-store-form cons-read-form) (get-setf-expansion cons env) (multiple-value-bind (alt-temp-vars alt-temp-vals alt-store-vars alt-store-form alt-read-form) (get-setf-expansion alt env) (let ((selector (gensym)) (new-store-vars (loop repeat (max (length cons-store-vars) (length alt-store-vars)) collect (gensym)))) (values ;; temp vars (cons selector (append cons-temp-vars alt-temp-vars)) ;; temp vals (cons test (nconc (mapcar (lambda (v) `(when ,selector ,v)) cons-temp-vals) (mapcar (lambda (v) `(unless ,selector ,v)) alt-temp-vals))) ;; store vars new-store-vars ;; store form `(multiple-value-bind ,cons-store-vars (when ,selector (values ,@new-store-vars)) (multiple-value-bind ,alt-store-vars (unless ,selector (values ,@new-store-vars)) (if ,selector ,cons-store-form ,alt-store-form))) ;; read form `(if ,selector ,cons-read-form ,alt-read-form))))))