/ / Clojureでは、自分のレコードと型に標準のClojureコレクションインタフェースをどのように実装できますか? - クロージュ

Clojureでは、標準のClojureコレクションインターフェイスを自分のレコードと型に実装する方法を教えてください。 - クロージャー

私はデータベーステーブルを表す抽象を作成したいのですが、それはすべての通常のClojure seqとconj、そしてすべてのその素晴らしいものを使ってアクセスすることができます。追加する必要があるプロトコルはありますか?

回答:

回答№1の15

はい。プロトコルはJavaインターフェースによって定義されます 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)))