Macros Clojure doseq生成巨大的代码?

Macros Clojure doseq生成巨大的代码?,macros,clojure,code-generation,Macros,Clojure,Code Generation,我最近一直在玩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)))

我最近一直在玩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字节)。这是正常的还是我做错了什么?运算符是一个简单的记录。如果有人感兴趣,这里有一个扩展结果的链接:

编辑:

通过同样的操作,但是使用for表单,我得到了一些更小几个数量级的内容(3653字节):

结果如下:


为什么两者之间存在如此巨大的差异?doseq表单看起来很无辜,当我收到一个错误,说java类大小已经超过时,我真的很惊讶。

好吧,看看
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))))))
(循环[seq_2365(seq[12])
组块2366无
计数(23670)
i_2368 0]
(如果(
理想情况下,我们只需要最后一个
let
表单,但
doseq
会发出额外的代码,以特定的方式处理
chunked-seq
,这样它会占用第一个块,然后对块中的每个项目执行
doseq
的主体,依此类推


此代码是为
doseq
中的单个seq生成的,但当您在其中有第二个seq时,则会生成用于处理分块seq的类似代码,因此它的大小会爆炸。

感谢您的解释,我认为这是沿着这些思路生成的。这仍然感觉是一个很大的限制,我想知道这是故意的行为。。。
(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))))))