评论人:hiredman
关于 clj-701 的回复
将循环表达式语义表示为 jvm 字节码是比较棘手的,因此编译器 kind of punts,将循环表达式提升到立刻调用的匿名函数中,关闭任何在循环中所需的局部作用域的内容,这有一些问题,比如 CLJ-701 中看到的问题,丢失 clojure 编译器不跨越函数跟踪的类型数据,函数对象的额外分配(jit 可能能很好地处理这个问题,我不确定)等。
clj-701 和此票据的世界相撞的地方是,此票据上的补丁将函数体提升为循环表达式,如果没有 clj-701 的补丁,将会有上面提到的问题,但我们已经在任何难以用字节码表示的表达式(循环尝试等)用作表达式的地方遇到这些问题,也许这无关紧要,或者 clj-701 将以某种方式修复来减轻这些问题。
一般思考
人们似乎喜欢断言的一个特性是可以禁用在生产环境中(我从未真正看到有人用Clojure这样操作过),断言以及:pre/:post有这个能力(可能仅在宏展开时起作用,我不太记得了),由于循环提升可能会影响性能,可能有一个机制来禁用循环提升会更好(可能使用断言相同的标志?)。