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年以来没有改变,所以可能有一些很好的理由。如果有,那是什么呢?如果没有,我们能改变宏绑定实现的实现,使其在~@body
周围实际上有一个do
吗?