评论者:hiredman
关于 clj-701 的回帖
在 JVM的字节码中表达循环语句的语义很复杂,因此编译器有点“踢皮球”,将表达式循环提升到立即调用匿名函数中,闭包所需的作用域中的任何内容,这有一些问题,就像 CLJ-701 中看到的那样,类型数据的丢失(Clojure 编译器不在函数间跟踪类型数据),函数对象的额外分配(Jit 可能处理得很好,我不确定)等。
clj-701 和此请求的世界相交的地方是该请求的补丁将函数体提升为循环表达式,如果没有 clj-701 的补丁,将出现上述问题,但我们已经在任何难以在字节码中以表达式(比如 loop 和 try)使用的表达式的地方遇到这些问题,也许这不重要,或者 clj-701 将以某种方式修复以减轻这些问题。
一些思考
人们似乎很喜欢 assert 的一个特性是可以将其在试用期禁用(我从未真正看到有人实际在 clojure 中这样做),assert 和 :pre/:post 具有几项这样的能力(这可能在宏扩展时才有效,我不记得了),因为提升循环可能会影响性能,可能有一个机制可以禁用它(也许使用 assert 的相同标志?)。