(defmacro mvlet* ((&rest bindings) &body body) (mvlet*-helper bindings body)) (defun mvlet*-helper (bindings body) (let* ((binding (car bindings)) (var (car binding)) (form (cadr binding)) (rec (if (endp (cdr bindings)) body (list (mvlet*-helper (cdr bindings) body))))) (if (consp var) `(multiple-value-bind ,var ,form ,@rec) `(let (,binding) ,@rec)))) (mvlet* (((i j) (values 1 2)) (k 3) ((l) (values k)) ((m n) (values k l))) (list i j k l m n))