评论者:hiredman
re clj-701
在 jvm 字节码中表达循环表达式语义很棘手,因此编译器会退而求其次,将表达式循环提升为立即调用的匿名函数,并捕获循环所需的任何作用域中的内容,这会带来一些问题,如 CLJ-701 中看到的问题,丢失 Clojure 编译器不跟踪跨函数的类型数据,额外分配函数对象(JIT 可能可以很好地处理这些问题,我不确定)等。
clj-701 和这张票的冲突在于,这张票的补丁将函数体提取出来作为循环表达式,如果不在 clj-701 的补丁中这样做,将会有上述问题,但我们已经在这些用作表达式的任何难以在字节码中表示为表达式(尝试和循环)的地方出现了这些问题,也许这无关紧要,或者 clj-701 可能以某种方式得到修复,从而减轻这些问题。
一般想法
人们从断言中喜欢的一个功能似乎是在生产环境中禁用它们的能力(我从未真正见过有人用Clojure这样做),assert以及:pre/:post有一些这样的能力(可能仅在宏展开时起作用,我记不清了)。由于循环提升可能会影响性能,可能有一个机制来禁用它(可能使用与assert相同的标志?)。