关于 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
吗?