_评论由 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}}默认值指向封闭作用域的提案。