评论者:hiredman
re clj-701
在 JVM 字节码中表达循环表达式语义有些棘手,因此编译器基本上采取回避策略,将表达式循环提升为立即调用的匿名函数,并关闭它需要的任何作用域中的内容,这产生了一些与 CLJ-701 中看到的问题,比如丢失类型数据(Clojure 编译器不跨函数跟踪类型数据),额外的函数对象分配(JIT 可能对此处理得很好,我不确定)等。
在 CLJ-701 和这个条目碰撞的是这个条目的补丁将函数体提升为循环表达式,如果没有 CLJ-701 中的补丁,将会有我列出的问题,但我们在任何困难以表达式方式作为表达式使用(尝试循环)的地方已经有这些问题了,也许这没关系,也许 CLJ-701 会以某种方式修复以减轻这些问题。
一些杂谈
用户喜欢断言中的一项特性是可以在生产环境中禁用它们(我从未实际看到有人这样使用Clojure),assert和:pre/:post有某些能力做到这一点(可能只在宏展开时有效,我不记得了),因为循环提升可能会影响性能,可能需要一些机制来禁用它(也许可以使用与assert相同的标志?)。