gpt4 book ai didi

macros - Clojure doseq 生成巨大的代码?

转载 作者:行者123 更新时间:2023-12-03 04:10:10 29 4
gpt4 key购买 nike

我最近一直在使用 clojure,遇到了一个我不知道如何处理的问题。我有一个包含 7 个参数的 dideq,它扩展到一个巨大的 block ,几乎超过了最大类大小。为什么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 字节)。这是正常现象还是我做错了什么? Operator 是一个简单的 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 类大小已超出时,我真的很惊讶。

最佳答案

好吧,看看 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-seq ,以便它获取第一个 block ,然后针对 block 中的每个项目执行 doseq 的主体,依此类推。

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

关于macros - Clojure doseq 生成巨大的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15341659/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com