clojure.core/binding
的文档字符串说它“以隐式do的形式执行exprs”。因此,我预期body的元素将按顺序执行,并返回最后一个的值(参见图例do
的文档字符串)。
然而,body表达式并没有被包裹在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
的实现,使其真正地将do
放在~@body周围吗?