对于 vs. Doseq(和方法代码太大)
user=> (def r (range 1))
user=> (for [a r, b r, c r, d r, e r, f r, g r, h r :when (and (= 0 a) (not= 1 b))]
(list a b c d e f g h))
((0 0 0 0 0 0 0 0))
user=> (doseq [a r, b r, c r, d r, e r, f r, g r, h r :when (and (= 0 a) (not= 1 b))]
(println (list a b c d e f g h)))
CompilerException java.lang.RuntimeException: Method code too large!, compiling:(/tmp/form-init8346140986526777871.clj:1:1)
这似乎来自clojure.asm.MethodWriter。我用Clojure搜索这个错误的谷歌搜索几乎没有发现任何命中。
所以。。。到底发生了什么?这个兔子洞有多深?这一行Clojure代码真的会产生一个>65KB的方法(值来自MethodWriter的源代码)吗?
如果这个答案击中了我遇到的问题,那么(a)为什么分块意味着它呈指数级增长而不是线性增长?(b)作为一名程序员,这对我有什么影响?例如,此行为是否众所周知且有意为之?我是否应该避免在超过 3 个或 4 个绑定的任何情况下使用?这与使用 和 相比如何?doseq
for
doall
也许相关: