评论者:michalmarczyk
@Stuart
为了证实上面所说的话,这里是在Clojure 1.6 REPL和Clojure 1.7 REPL中评估的相同代码片段,两个REPL都是新启动的,结果不同
Clojure 1.6.0
(let [foo 1 bar 2
{:keys [foo bar]
:or {foo 3 bar (inc foo)}} {}]
[foo bar])
[3 2]
Clojure 1.7.0
(let [foo 1 bar 2
{:keys [foo bar]
:or {foo 3 bar (inc foo)}} {}]
[foo bar])
[3 4]
官方文档中并未承诺 {{:or}} 和 {{:keys}} 之间不会有令人惊讶的交互,但如上所述,所有依赖 1.6 行为的现有代码都已被 1.7 打破。指定 *某些* 行为并在未来坚持这一行为将防止未来的此类意外。
我认为当前行为在某种程度上是“随机的”,因为没有任何原则上的理由可以解释为什么会这样 - 因此我提出了将 {{:or}} 的默认值引用到我在补丁中实现的封装作用域的方案。