评论由:hiredman 发布
re clj-701
在 JVM 字节码中表示循环表达式语义比较复杂,因此编译器只能姑且规避这个问题,将表达式循环提升到立即调用的匿名函数中,把循环所需的作用域内的所有内容都包起来,这带来了一些问题,类似于 CLJ-701 中看到的问题,丢失了 clojure 编译器在函数间追踪的类型数据,以及函数对象额外的分配(JIT 处理这个问题可能相当好,我不确定)等等。
CLJ-701 的世界和这张票据相遇的地方是这张票据上的补丁将函数主体提升为循环表达式,在没有 CLJ-701 修复的情况下,将遇到我上面列出的问题,但我们已经在这类难以用字节码表达为表达式的某些事情(尝试循环)用作表达式的地方遇到了这些问题,也许这就足够了,或者也许 CLJ-701 会在某些方面得到修复以减轻这些问题。
一般思考
好像人们喜欢断言的特性之一是能够在生产环境中禁用它们(我从未看到有人用 clojure 这样做过),assert 和 :pre/:post 有一些能力做到这一点(这可能在宏展开时才有效,我不记得了),因为提升循环可能会影响性能,可能需要一个机制来禁用它(可能使用 assert 的同一个标志?)。