为什么从Clojure的catch部分重复出现是非法的

为什么从Clojure的catch部分重复出现是非法的,clojure,Clojure,至少已经有关于在异常情况下重复出现的问题。我的问题是为什么Clojure编译器不接受这个recur (loop [] (try (catch Exception _ex (recur)))) 错误为“只能从尾部位置重复” 根据控制流,此重复处于尾部位置,因为在重复内部循环表单中,代码不做任何操作。如果在询问“为什么会这样?”时,您询问的是历史记录,您可以在处将此问题发布到Clojure邮件列表中,获得更好的答案clojure@googlegroups.com。我怀疑原因

至少已经有关于在异常情况下重复出现的问题。我的问题是为什么Clojure编译器不接受这个
recur

(loop []
  (try
    (catch Exception _ex
      (recur))))
错误为“只能从尾部位置重复”

根据控制流,此
重复
处于尾部位置,因为在
重复
内部
循环
表单中,代码不做任何操作。

如果在询问“为什么会这样?”时,您询问的是历史记录,您可以在
处将此问题发布到Clojure邮件列表中,获得更好的答案clojure@googlegroups.com
。我怀疑原因是编译器作者从未考虑过这个用例

如本例所示,您可以很容易地模拟所需的行为。它不像上一个问题中的大多数答案那样使用宏:

    (loop [count 5]
      (newline)
      (println "top of loop; count=" count)
      (let [caught-ex (try
                        (println "in try")
                        (/ 1 0)
                        false
                        (catch Exception ex
                          (println "   in catch; count=" count "   cause:  " (.getMessage ex))
                          true))]
           (when (and caught-ex
                   (pos? count))
             (recur (dec count)))))
结果:

top of loop; count= 5
in try
   in catch; count= 5    cause:   Divide by zero

top of loop; count= 4
in try
   in catch; count= 4    cause:   Divide by zero

top of loop; count= 3
in try
   in catch; count= 3    cause:   Divide by zero

top of loop; count= 2
in try
   in catch; count= 2    cause:   Divide by zero

top of loop; count= 1
in try
   in catch; count= 1    cause:   Divide by zero

top of loop; count= 0
in try
   in catch; count= 0    cause:   Divide by zero

显然,
rescur
finally
子句中也是不允许的<代码>(循环[](try(catch Exception uu)(finally(recur)))会导致相同的编译错误。这个用例当然已经考虑过了,并且之前已经讨论过。参见和,例如。