- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近一直在使用 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/
我最近一直在使用 clojure,遇到了一个我不知道如何处理的问题。我有一个包含 7 个参数的 dideq,它扩展到一个巨大的 block ,几乎超过了最大类大小。为什么doseq 会扩展到如此巨大的
我需要根据 Clojure 集合的元素将一些内容写入文件,我可以这样做——但我遇到了一些让我感到困惑的事情。可能是因为我不完全理解时间宏,但是当我执行以下操作时: => (def nums (take
user=> (def r (range 1)) user=> (for [a r, b r, c r, d r, e r, f r, g r, h r :when (and (= 0 a) (not
我写了一个简单的程序,它接受一个数字 n 和一个列表作为输入。然后将列表中的每个元素打印 n 次。 我最初尝试过这个 (defn list-repl [num lst] (doseq [elem
我正在通过解决问题来学习 Clojure,我陷入困境 with one of them ,基本上我必须在日志文件中找到前五个字符串。 这是我到目前为止所得到的: (ns topfive (:imp
我是 Clojure 新手。我有一个 map 向量: (def vecmap [{:a "hello"} {:a "hi"} {:a "hey"}]) 基本上我想检查 map 向量中是否存在给定值。我
这在其他语言中通常是微不足道的,但我在 Clojure 中找不到这样的例子。 我可以使用以下方法打印整个文件: (with-open [rdr (io/reader "file")]
我是 Clojure 新手。我有一个 map 向量: (def vecmap [{:a "hello"} {:a "hi"} {:a "hey"}]) 基本上我想检查 map 向量中是否存在给定值。我
在尝试复制一些 websockets 示例时,我遇到了一些我不理解且似乎无法找到文档的行为。简单来说,这是我在 lein 中运行的一个示例,它应该每秒为共享 map 中的每个元素运行一次函数: (de
我正在通过 SICP 进行工作 - 一项练习是实现 foreach (doseq)。 这是一个学术练习。在 Clojure 中,这是我想出的: (defn for-each [proc, items]
我正在尝试从 let 语句返回一个列表。 (let [data []] (doseq [x ["0" "1" "2" "3" "4"]] (into data (do-stuff x))) da
如果您一整天都在关注我的问题, 我正在 clojure 中做一个类项目,但在读取文件、解析文件以及根据其内容创建图表时遇到困难。我已成功打开并读取文件并根据需要解析行。我现在面临的问题是根据读入的数据
我不太确定如何表达该主题的名称,因此如果您可以澄清,请这样做。 我的示例代码是这样的: (doseq [x [1 2 3] y [3 2 1]] (println (str x y))) 该代码的输出
我是一名优秀的程序员,十分优秀!