欢迎!请参阅关于页面以获得有关如何工作的更多信息。
将元数据应用于lazy-seq会导致实现
(def x (vary-meta (lazy-seq (prn :realized)) assoc :foo :bar)) :realized
这可能有点令人惊讶,所以修改lazy-seq的docstring来提及这一点。
补丁
评论由: alexmiller发表
我认为seq()在这里被调用来确保旧LazySeq实例和新实例共享序列。否则,预元数据和后元数据版本将在相同的输入上执行相同的函数调用,但它们将是断开的,这似乎很糟糕。
我不确定在哪里记录这一点。也许在https://clojure.org/metadata页面上?
评论由: mpenet发表
是的,这很有道理,而且在lazy-seq的docstring上也是这样的。
我在元数据页面添加了一句句子,并将描述更新为更适用于这里的文档字符串更改。
评论者:michaelblume
在这个补丁中,with-meta 不会识别 seq,但实现仍然只发生一次 -- 这是否是一个可接受的方法?
添加了测试