评论者:hiredman
re clj-701
在 JVM 字节码中表达循环表达式语义比较棘手,因此编译器有点逃避,将表达式循环提升到立即执行的匿名函数中,关闭作用于循环所必需的任何作用域内的内容,这会产生一些问题,如 CLJ-701 中看到的问题,类型数据的丢失,clojure 编译器不跟踪函数之间的类型数据,函数对象的额外分配(jit 可能会很好地处理这些,我不太确定)等。
CLJ-701 和此票据的世界相交的地方是这个票据上的补丁将函数体提升出来作为循环表达式,如果没有 CLJ-701 中的补丁,它将会有我上面列出的问题,但我们已经有这些问题了,任何难以在字节码中作为表达式表示的东西(尝试循环)都用作表达式,这可能无关紧要,或者 CLJ-701 将以某种方式修复以减轻这些问题。
一般思考
人们从断言(asserts)中喜欢的一个特性似乎是可以将它们在生产环境中禁用(我从未真正看到有人用 Clojure 干这个),断言和 :pre/:post 有一点点做这个的能力(可能只是在宏展开时生效,我不太记得了)。由于循环提升可能会影响性能,可能需要有一种机制来禁用它(可能使用断言相同的标志?)。