评论者为:hiredman
关于clj-701的回复
在jvm字节码中表达循环表达式语义是有些技巧的,所以编译器有点回避,将表达式循环提升为立即调用的匿名函数,关闭任何在作用域中需要循环的东西,这有一些问题,比如CLJ-701中看到的问题,丢失类型数据,Clojure编译器不会跨函数跟踪,额外的函数对象分配(jit可能处理得相当好,我不确定)等。
clj-701的世界和这个票据相冲突在于这个票据的补丁将函数体提升为循环表达式,没有clj-701中的补丁,将会有我列出的问题,但我们已经在任何难以用表达式表达的字节码(例如循环)作为表达式的情况下有这些问题,可能没关系,或者clj-701将以某种方式修复以减轻这些问题。
一般思考
似乎人们喜欢断言中的一个特性是能够禁用在生产环境中的使用(我实际上从未见过有人用Clojure这样做过),assert和:pre/:post有一定的能力实现这个功能(可能只会在宏展开时生效,我不记得了),由于循环提升可能会影响性能,因此有一种机制可以禁用这个功能可能是个不错的想法(也许可以使用与assert相同的标志?)。