6

最近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クラスのサイズを超えたというエラーが表示されたときは本当に驚きました。

4

1 に答える 1

3

さて、のより小さなマクロ展開を見るとdoseq、理由が明らかになります。

(loop [seq_2365 (seq [1 2])
       chunk_2366 nil
       count_2367 0
       i_2368 0]
  (if (< i_2368 count_2367)
    (let [x (.nth chunk_2366 i_2368)]
      (do x)
      (recur seq_2365 chunk_2366 count_2367 (unchecked-inc i_2368)))
    (when-let [seq_2365 (seq seq_2365)]
      (if (chunked-seq? seq_2365)
        (let [c__4197__auto__ (chunk-first seq_2365)]
          (recur (chunk-rest seq_2365) c__4197__auto__ (int (count c__4197__auto__)) (int 0)))
        (let [x (first seq_2365)]
          (do x)
          (recur (next seq_2365) nil 0 0))))))

理想的には、最後のletフォームのみが必要ですが、特定の方法でdoseq処理する追加のコードを発行して、最初のチャンクを取得し、チャンク内の各アイテムに対して、の本体などを実行します。chunked-seqdoseq

このコードはの単一のseqに対して生成されdoseqますが、2番目のseqが含まれている場合、chunked-seqを処理するための同様のコードが生成されるため、サイズが大きくなります。

于 2013-03-11T16:08:35.170 に答える