profile.ss
#lang mzscheme

(require scheme/contract
         (file "log.ss"))

; Procedures -----------------------------------

;; profile : string (any ... -> any1) any ... -> any1 
(define (profile message fn . args)
  (define start-time #f)
  (define end-time   #f)
  (dynamic-wind
   (lambda ()
     (set! start-time (current-milliseconds)))
   (lambda ()
     (apply fn args))
   (lambda ()
     (set! end-time (current-milliseconds))
     (log-message "Profile" message (- end-time start-time)))))

; Provide statements ---------------------------

(provide/contract
 [profile (->* (string? procedure?) () #:rest any/c any)])