评论者: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}}默认项参考封装作用域的提议。