在Clojure中如何在自己的记录和类型上实现标准的Clojure集合接口?

我想创建一个代表数据库表的抽象,但是可以使用所有常用的Clojure seq和conj和所有那些花哨的东西来访问它。有没有协议我需要添加?
是。协议由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)))
http://stackoverflow.com/questions/4586562/in-clojure-how-can-i-implement-standard-clojure-collection-interfaces-on-my-own

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在Clojure中如何在自己的记录和类型上实现标准的Clojure集合接口?