评论者:hiredman
re clj-701
在jvm字节码中表达循环表达式语义比较棘手,因此编译器有点推卸责任,将表达式循环提升到立即调用的匿名函数中,捕获任何在循环中需要的变量,这有一些问题,比如CLJ-701中看到的问题,丢失类型数据——clojure编译器在函数间不跟踪类型数据,额外的函数对象分配(jit可能会很好地处理这个问题,我不确定)等。
当clj-701与这张票的冲突世界交汇时,这张票上修补的部分将函数体提取出来作为循环表达式,如果没有在clj-701中修补,将会出现我上面列举的问题,但我们已经在某些地方遇到了这些问题,这些地方使用作为表达式的难以用字节码表达的内容(尝试和循环)作为表达式,可能这无关紧要,或者可能clj-701将以某种方式修复以减轻这些问题。
一般思考
人们喜欢断言的一个功能似乎是能够在生产环境中禁用它们(我从未真正看到有人用clojure这样做),assert和:pre/:post有一些能力做这件事(可能只适用于宏观扩展时间,我不记得了),因为循环提升可能会影响性能,可能有一种机制来禁用它(可能使用与assert相同的标志?)。