评论者:michalmarczyk
@Stuart
为了证实上面说的,这里是在Clojure 1.6 REPL中 evaluates the same code snippet,然后在Clojure 1.7 REPL中再次evaluate,两个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}}默认值指向包围作用域的建议。