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)
Questo sembra venire da clojure.asm.MethodWriter. Il mio googling per questo errore con Clojure si presenta quasi senza colpi.Per vs. Doseq (e Codice metodo troppo grande)
Quindi ... che diavolo sta succedendo? Quanto è profonda questa tana del coniglio? Questa linea del codice Clojure produce davvero un metodo> 65 KB (il valore proviene dalla sorgente di MethodWriter)?
Se this answer colpisce il problema che sto incontrando, allora (a) perché il chunking significa che cresce in modo esponenziale anziché in modo lineare? E (b) quali sono le implicazioni per me come programmatore? Ad esempio, questo comportamento è ben noto e inteso? Dovrei evitare di usare doseq
per qualsiasi situazione con più di 3 o 4 associazioni? In che modo si confronta con l'utilizzo di for
e doall
?
Forse correlati:
Clojure doseq generates huge code
Method code too large! exception using ASM
Sembra che ogni ulteriore associazione nella tua doseq raddoppia la dimensione del codice generato (l'ho provato con no.disassemble). Non so perché. –
+1 Wooha! Bella presa! Sono davvero interessato a saperne di più. – Chiron
La mia ingenua aspettativa sarebbe quella tra 'for' e' doseq', sarebbe 'for' che produrrebbe il metodo più grande. Se 'doseq' ha questo tipo di inefficienza al di sotto, allora sarei interessato a sapere a quale soglia della complessità si ottengono prestazioni migliori con (' ign ignora (doall (per [materiale] (effetto collaterale))) "invece del più naturale" (doseq [effetto collaterale]) ". – galdre