评论由:hiredman 提出
re clj-701
在jvm字节码中表达循环表达式语义很复杂,因此编译器有点规避,将表达式循环提升到匿名函数中,立即调用,关闭任何在范围内需要循环的所有内容,这有一些问题,如CLJ-701所见,丢失类型数据,Clojure编译器不跟踪函数之间的类型数据,额外的函数对象分配等。
当clj-701和这里的票据在某个接合点上碰撞时,这个票据上的接合处会将函数体提升为一个循环表达式,如果没有在clj-701中补丁,将会出现我上面列出的问题。但我们现在遇到的问题是我们任何地方都难以在字节码中用表达式(尝试和循环)表示,也许这无关紧要,或者clj-701可能会以某种方式得到修复以减轻这些问题。
一些随想
人们似乎喜欢断言的一个特性是它们可以在生产环境中禁用(我从未在Clojure中见过有人这样做),assert和:pre/:post有一些这样的能力(可能仅在宏展开时起作用,我不记得了),由于循环提升可能影响性能,拥有某种禁用机制可能很好(也许使用断言的相同标志?)。