文档字符串说明 clojure.core/binding
在"隐式执行exprs"。因此,可以预期主体的元素将按顺序执行,并返回最后一个的值(参照 do
的文档字符串)。
然而,主体表达式并没有包裹在 do
或 let
中,而是包裹在 try
中。这会导致一些意想不到的行为
(binding [clojure.core/*print-length* 10]
(/ 10 0)
(catch Exception e
:failure))
上面的表达式返回 :failure
,而下面的表达式更容易抛出编译器异常,因为不使用 try
时不能使用 catch
。
(binding [clojure.core/*print-length* 10]
(do
(/ 10 0)
(catch Exception e
:failure)))
根据git历史记录,这个实现细节自2008年以来没有改变,所以这或许有一些合理的理由。如果确实如此,那么是什么理由?如果不是,我们能否将 binding
的实现改为实际在 ~@body
周围包裹一个 do
?