618のを試すついでにそれっぽくしてみた。

(defmacro with-file (filename &rest body)
  (let ((buf (gensym "--buf--")) (fn (gensym "--fn--")))
    `(let ((,fn ,filename))
       (let ((,buf (get-file-buffer ,fn)) need-close)
         (unless ,buf
           (setq ,buf (find-file ,fn) need-close t))
         (when ,buf
           (unwind-protect (progn ,@body)
             (when need-close
               (kill-buffer ,buf))))))))
(put 'with-file lisp-indent-function 1)

(defmacro edit-files (files &rest body)
  (let ((f (gensym "--f--")))
    `(mapc (lambda (,f) (with-file ,f ,@body (save-buffer))) ,files)))
(put 'edit-files lisp-indent-function 1)

(edit-files '("~/file1" "~/file2" "~/file3")
            (upcase-region (point-min) (point-max)))