【发布时间】:2013-02-26 19:27:49
【问题描述】:
我最近一直在玩 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
为什么两者之间有如此巨大的差异? doseq 形式看起来很无辜,当我收到一个错误说 java class size has been exceeded 时,我真的很惊讶。
【问题讨论】:
标签: macros clojure code-generation