gpt4 book ai didi

clojure - 在 Clojure 中,如何在我自己的记录和类型上实现标准 Clojure 集合接口(interface)?

转载 作者:行者123 更新时间:2023-12-03 00:56:34 26 4
gpt4 key购买 nike

我希望创建一个代表数据库表的抽象,但可以使用所有常用的 Clojure seq 和 conj 以及所有这些奇特的东西来访问它。我需要添加协议(protocol)吗?

最佳答案

是的。该协议(protocol)由 Java 接口(interface) clojure.lang.ISeq 定义。您可能想要扩展 clojure.lang.ASeq ,它提供了它的抽象实现。

下面是一个示例:资源的 seq 抽象,它是可关闭的,并且在 seq 结束时自动关闭。 (未经严格测试)

(deftype CloseableSeq [delegate-seq close-fn]
clojure.lang.ISeq
(next [this]
(if-let [n (next delegate-seq)]
(CloseableSeq. n close-fn)
(.close this)))
(first [this] (if-let [f (first delegate-seq)] f (.close this)))
(more [this] (if-let [n (next this)] n '()))
(cons [this obj] (CloseableSeq. (cons obj delegate-seq) close-fn))
(count [this] (count delegate-seq))
(empty [this] (CloseableSeq. '() close-fn))
(equiv [this obj] (= delegate-seq obj))
clojure.lang.Seqable
(seq [this] this)
java.io.Closeable
(close [this] (close-fn)))

关于clojure - 在 Clojure 中,如何在我自己的记录和类型上实现标准 Clojure 集合接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4586562/

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