gpt4 book ai didi

clojure - Clojure 核心中的哪些函数保留元数据?

转载 作者:行者123 更新时间:2023-12-03 00:31:11 24 4
gpt4 key购买 nike

仅当函数谨慎执行时才会保留 Clojure 元数据,并且 Clojure 核心函数不会全局保留元数据。我听说的一般经验法则是像 conj、assoc 等集合函数应该保留元数据,但像 map、filter、take 等序列函数不保留元数据。

是否有一个列表列出了哪些函数可以保存元数据?

最佳答案

一切都与类型有关。序列函数的行为就像调用 seq根据他们的论点,因此并不总是返回相同类型的对象。集合函数和特定于类型的函数不会调用 seq 并返回与给定它们的类型相同的对象。这有点让他们产生返回同一个对象的错觉(这可能是这种行为的原因),即使事实并非如此。我们可以说,经验法则是函数在保留类型时也保留元。

user> (meta (seq (with-meta (list 1) {:a 1})))
{:a 1}
user> (meta (seq (with-meta (vector 1) {:a 1})))
nil

一定要注意何时涉及懒惰:

user> (type (list 1))
clojure.lang.PersistentList
user> (type (map identity (list 1)))
clojure.lang.LazySeq
user> (meta (seq (with-meta (map identity (list 1)) {:a 1})))
nil

有关在集合上保留元的函数列表,请参阅 data structures页。那些不保留元的在sequences下页面,但返回相同类型的对象时除外。

在幕后,我不太确定细节,因为添加了惰性和分块序列,但您可以查看 cons , seqseqFrom方法来自RT类(class)。不保留元数据的函数通过这些方法。虽然集合函数最终使用特定于其类型的方法。

关于clojure - Clojure 核心中的哪些函数保留元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4673011/

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