评论者:hiredman
关于 clj-701 的评论
由于在 JVM 字节码中表示循环表达式的语义复杂,编译器有点退缩,将表达式循环提升到立即调用的匿名函数中,关闭所需的作用域中的内容,这导致了一些问题,如 CLJ-701 中看到的问题,丢失了 clojure 编译器不跟踪跨函数的类型数据,额外的函数对象分配(JIT 可能会很好地处理这个问题,我不确定)等等。
clj-701 和这个工单的世界冲突在于,这个工单中的补丁将函数体提高为循环表达式,如果没有 clj-701 中的补丁,将会有我上面列出的问题,但我们已经在任何难以在字节码中以表达式形式表示(尝试和使用循环)的地方遇到了这些问题,也许这无关紧要,也许 clj-701 将通过某种方式得到修复以缓解这些问题。
一般感想
人们似乎喜欢assert的一个特性是能够于生产环境中禁用它(我从未真正看到有人用Clojure这样做过),assert和:pre/:post有一些禁用功能(也许只有在宏展开时才生效,我不记得了)因为循环提升可能会影响性能,所以有一个禁用它的机制可能很不错(也许使用和assert相同的标志?)。