_评论者:michalmarczyk_
@Stuart
为了证实上述说法,以下是在Clojure 1.6和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}}默认值指向包围作用域的提议,我在补丁中实现了这一功能。