我不知道如何在Clojure中实现这段Python代码
for i in range(3):
try:
......
except e:
if i == 2:
raise e
else:
continue
else:
break
我想知道为什么在 Python 中如此简单的事情在 Clojure 中却如此困难。我认为困难在于 Clojure 是一种函数式编程语言,因此不适合这种命令式任务。这是我的尝试:
(first
(remove #(instance? Exception %)
(for [i (range 3)]
(try (......)
(catch Exception e
(if (== i 2)
(throw e)
e)))))))
它非常丑陋,更糟糕的是,它不能按预期工作。 for 循环实际上是完全评估的,而不是懒惰的(当我在里面放入 println 时我意识到了这一点)。
如果有人有更好的想法来实现这一点,请赐教。
与 Marcyk 的答案类似,但没有宏观技巧:
(defn retry
[retries f & args]
(let [res (try {:value (apply f args)}
(catch Exception e
(if (zero? retries)
(throw e)
{:exception e})))]
(if (:exception res)
(recur (dec retries) f args)
(:value res))))
有点复杂,因为你不能recur
里面一个catch
条款。请注意,这需要一个函数:
(retry 3 (fn []
(println "foo")
(if (zero? (rand-int 2))
(throw (Exception. "foo"))
2)))
=>
foo ;; one or two or three of these
foo
2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)