评论者:hiredman
re clj-701
jvm 字节码中表达循环表达式语义是有些棘手的,因此编译器有点回避,将循环表达式提升到立即执行的匿名函数中,覆盖所需的任何作用域内容,这有一些问题,如 CLJ-701 中看到的那样,丢失类型数据(Clojure 编译器在函数间不跟踪这些数据),函数对象(jit 可能能很好地处理它,我不确定)的额外分配等。
clj-701 和此问题冲突的地方在于此补丁将函数体提升为循环表达式,而没有 clj-701 中的补丁将会有上述问题,但这些问题在任何难以用字节码作为表达式表示的(尝试循环)用作表达式的地方都存在,也许这没关系,或者也许 clj-701 将以某种方式得到修复以缓解这些问题。
泛泛而谈
似乎人们喜欢断言的一个特性是能够在生产中禁用它们(我实际上从未见过有人用 Clojure 做这件事),断言和 :pre/:post 有一些这样的能力(它可能在宏展开时才起作用,我不记得了),由于提升循环可能会影响性能,可能需要有一种机制来禁用它(也许使用与断言相同的标志)?