(defmacro with-retry-restart ((restart-name control-string &rest format-args) &body forms) (let ((loop-tag (gensym)) (stream-var (gensym)) (block-name (gensym))) `(block ,block-name (tagbody ,loop-tag (restart-case (return-from ,block-name (progn ,@forms)) (,restart-name () :report (lambda (,stream-var) (format ,stream-var ,control-string ,@format-args)) (go ,loop-tag)))))))