В Clojure, как я могу реализовать стандартные интерфейсы коллекции Clojure для своих собственных записей и типов? - PullRequest
18 голосов
/ 03 января 2011

Я хочу создать абстракцию, которая представляет таблицу базы данных, но к которой можно получить доступ, используя все обычные Clojure seq и Con и все эти причудливые вещи.Есть ли протокол, который мне нужно добавить?

1 Ответ

15 голосов
/ 03 января 2011

Да. Протокол определяется интерфейсом 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...