由:hiredman发表的评论
re clj-701
在jvm字节码中表达循环表达式语义是很棘手的,所以编译器会略微避开,将表达式循环提升到立即调用的匿名函数中,覆盖循环所需的任何作用域,这会带来一些问题,就像在CLJ-701中看到的那样,失去了Clojure编译器在函数间不跟踪的类型数据,额外的函数对象分配(jit可能处理得相当好,我无法确定)等等。
clj-701和此票证相交的世界是此票证的补丁将函数体提升为循环表达式,如果没有clj-701中的补丁,将会有我列出的问题,但是我们已经在任何用作表达式(尝试并循环)的难以用字节码表达的事物中有了这些问题,可能没关系,或者clj-701将通过某种方式修复以缓解这些问题。
一般思考
人们似乎喜欢断言的一个功能是能够在生产中禁用它们(我从未见过有人用Clojure这样做过),assert和:pre/:post有一些能力来实现这一点(这可能只在工作宏展开时工作,我不记得了),因为循环的提升可能会影响性能,可能需要一个机制来禁用它(也许可以使用断言使用的同一个标志?)。