clojure.core/binding
的文档字符串说,它“在隐式的do中执行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
吗?