评论者: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}} 默认值指向包围作用域的提案,这是我已在补丁中实现的。