下面是我试图描述的retry-n-times函数的变形。同样,这个版本假设你永远不会关心保持调用(f)抛出的异常。
(defn retry-n-times [f n]
(let [sentinel (Object.)]
(loop [i 0]
(if (= i n)
;; 这里是抛出你自己的期望异常的位置。
;; 在这个例子中,我只是返回一个映射。
{:调用的次数 i, :每次都失败 true}
;; 没有必要 println,只是好看,可以看到正在发生什么
;; 当测试这个新函数时。
(let [_ (println "调用 (f) 尝试" (inc i) "...")
ret (try
(f)
(catch java.lang.AssertionError e
sentinel))]
(if (identical? ret sentinel)
(recur (inc i))
ret))))))