评论由:hiredman
re clj-701
在 JVM 字节码中表达循环表达式语义相当棘手,因此编译器采取回避策略,将表达式循环提升为立即调用的匿名函数,覆盖任何循环所需的当前作用域中的内容,这可能会产生一些问题,例如在 CLJ-701 中看到的问题,比如丢失 Clojure 编译器无法追踪的函数间的类型数据,额外分配函数对象(JIT 可能能很好地处理这个问题,我不确定)等等。
clj-701 和这张补丁的冲突点在于,该补丁将函数体提升为循环表达式,如果没有 clj-701 的补丁,将会有我上面列举的问题,但我们已经在任何难以用字节码作为一个表达式表达的(尝试和循环)地方遇到了这些问题,也许这并不重要,或者也许 clj-701 中的问题会以某种方式得到解决。
一般思考
人们似乎喜欢断言的一个特性是能够在生产中禁用它们(我从未在 Clojure 中看到有人这么做),assert 和 :pre/:post 有一些能力去做这个(这可能只在工作时有效,我不记得了),因为循环的提升可能会影响性能,可能需要有一个机制来禁用它(也许使用与 assert 相同的标志?)。