gpt4 book ai didi

lisp - 将元数据添加到惰性序列

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:21 24 4
gpt4 key购买 nike

当我尝试将元数据添加到 Clojure 中的无限惰性序列时,出现堆栈溢出,如果我删除元数据,它就可以正常工作。为什么添加 with-meta 宏会破坏惰性序列?

首先创建一个非常好的数字的无限序列:

(defn good []  (lazy-seq     (cons 42      (good))))user> (take 5 (good))(42 42 42 42 42)

然后,向每个 lazy-seq 实例添加一些元数据:

(defn bad []  (lazy-seq     (cons 42      (with-meta        (bad)       {:padding 4}))))user> (take 5 (bad))java.lang.StackOverflowError (NO_SOURCE_FILE:0)  [Thrown class clojure.lang.Compiler$CompilerException]

尝试将元数据向上移动一级:

(defn also-bad []  (with-meta    (lazy-seq      (cons 42       (also-bad)))   {:padding 4}))user> (take 5 (foo))java.lang.StackOverflowError (NO_SOURCE_FILE:0)  [Thrown class clojure.lang.Compiler$CompilerException]

这里是一个关于有限序列的元数据的例子:

(defn also-works []     (lazy-seq        (cons 4          (with-meta           ()           {:a 5}))))user> (also-works)(4)user> (meta (rest (also-works))){:a 5}user> 

最佳答案

因为 LazySeq 会在您对 LazySeq 调用 withMeta 时立即评估其主体。你失去了懒惰。

public final class LazySeq extends Obj implements ISeq, List{
...
public Obj withMeta(IPersistentMap meta){
return new LazySeq(meta, seq());
}
...
}

seq() 计算惰性 seq 的主体(如果尚未计算)。上面的代码不断调用 with-meta 对连续的惰性序列进行评估,直到堆栈爆炸。我认为目前没有任何方法可以将元数据添加到惰性 seq 而不会导致它评估其主体。

关于lisp - 将元数据添加到惰性序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1056061/

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