_评论者: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}}的默认值设置为引用封装作用域的方案,我在补丁中实现了这个方案。