评论由: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}} 的默认值引用封闭作用域,就像我在补丁中实现的那样。