Modify Macro updatef &rest places-and-update-functionsresults

updatef is exactly like setf, except that instead of directly providing new values to store into the place, one provides update functions that will be called with the corresponding old value. Each store variable is bound to the result of calling the corresponding update function with the old value, then the storing form is evaluated.

(defun double (number) (* number 2))

(let ((a 2) (b 8))
  (updatef (values a b) #'double)
  (values a b))

⇒ 4, NIL
(let ((a 2) (b 8))
  (updatef a #'1+
           a #'double
           b #'-)
  (values a b))

⇒ 6, -8
(let ((a #(1 2)))
  (updatef (aref (print a) (print 1))
           (print #'double))
  a)
  -| #(1 2)
  -| 1
  -| #<FUNCTION DOUBLE>

⇒ #(1 4)