#lang scheme/base (require scheme/promise) (define (repeatedly maximum err proc) (let loop ((tries 0)) (let/ec okay (let/ec retry (call-with-values (λ () (proc retry)) okay)) (if (< tries maximum) (loop (+ tries 1)) (error (if (promise? err) (force err) err)))))) (define (test) (list (with-handlers ((exn:fail? (λ (e) "yay we failed\n"))) (repeatedly 10 "fail" (λ (retry) (display "beep\n") (retry)))) (repeatedly 10 "no problem" (λ (retry) "...BOOP\n")))) (provide repeatedly)