safe-output.rkt
#lang racket/base

(define (safe-output-file name next)
   (let* ((temp (path-add-suffix name ".tmp")))
     (with-handlers
      ((exn:fail? (λ (e) (when (file-exists? temp) (delete-file temp)))))
      (call-with-output-file
       temp
       #:exists
       'replace
       (λ (output)
         (next output)
         (when (file-exists? name) (delete-file name))
         (rename-file-or-directory temp name))))))

(define (test)
   (safe-output-file
    (build-path (find-system-path 'home-dir) "feep.txt")
    (λ (output) (write '(this is a toast) output))))

(provide safe-output-file)