最近clojureで遊んでいて、対処方法がわからないという問題が発生しました。私は7つのパラメーターを持つdoseqを持っていて、それは巨大なブロックに拡張され、ほぼ最大クラスサイズを超えています。なぜdoseqはclojureコードのそのような巨大なブロックに拡張するのですか?
例:
(def q '(doseq
[p0 (nth (:params operator) 0 (quote (nil)))
p1 (nth (:params operator) 1 (quote (nil)))
p2 (nth (:params operator) 2 (quote (nil)))
p3 (nth (:params operator) 3 (quote (nil)))
p4 (nth (:params operator) 4 (quote (nil)))
p5 (nth (:params operator) 5 (quote (nil)))
p6 (nth (:params operator) 6 (quote (nil)))]
(do-print board (:oname operator) p0 p1 p2 p3 p4 p5 p6)))
その後:
(macroexpand q)
私のマシンでは、これにより大量のコード(97331バイト)が生成されます。これは正常ですか、それとも私は何か間違ったことをしていますか?演算子は単純なdefrecordです。誰かが興味を持っているなら、ここに拡張された結果へのリンクがあります:http: //pastebin.com/6gw1q078
編集:
同じことを実行しますが、forフォームを使用すると、数桁小さいもの(3653バイト)が得られます。
(def q '(for
[p0 (nth (:params operator) 0 (quote (nil)))
p1 (nth (:params operator) 1 (quote (nil)))
p2 (nth (:params operator) 2 (quote (nil)))
p3 (nth (:params operator) 3 (quote (nil)))
p4 (nth (:params operator) 4 (quote (nil)))
p5 (nth (:params operator) 5 (quote (nil)))
p6 (nth (:params operator) 6 (quote (nil)))]
(do-print board (:oname operator) p0 p1 p2 p3 p4 p5 p6)))
(macroexpand q)
結果はここにあります:http://pastebin.com/9MAKK3VD
なぜこの2つの間に大きな違いがあるのですか?doseq形式は十分に無実に見えますが、Javaクラスのサイズを超えたというエラーが表示されたときは本当に驚きました。