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. Мой googling для этой ошибки с Clojure почти не вызывает хитов.
Итак... что же происходит? Насколько глубока эта кроличьи дыры? Является ли эта одна строка кода Clojure действительно производящей метод > 65 КБ (значение исходит от источника MethodWriter)?
Если этот ответ влияет на проблему, с которой я сталкиваюсь, тогда (а) почему chunking означает, что она растет экспоненциально, а не линейно? И (б) каковы последствия для меня как программиста? Например, является ли это поведение известным и предназначенным? Следует ли мне избегать использования doseq
для любой ситуации с более чем 3 или 4 привязками? Как это соотносится с использованием for
и doall
?
Возможно, связано: