这里是我想要描述的函数 retry-n-times 的变体。再次提醒,这个版本假设你从不关心保留调用抛出的异常(f)。
(defn retry-n-times [f n]
(let [sentinel (Object.)]
(loop [i 0]
(if (= i n)
;; 此处你可以抛出自定义的异常。
;; 在此示例中,我只是返回一个映射。
{:call-count i, :failed-every-time true}
;; 不需要 println - 只是当你像测试这个新函数一样想看到发生的事情时很好。
;; 当测试这个新函数时。
(let [_ (println "调用 (f) 尝试" (inc i) "...")
ret (try
(f)
(catch java.lang.AssertionError e
sentinel))]
(if (identical? ret sentinel)
(recur (inc i))
ret))))))