Итак, вы вводите ссылку, потому что вы хотите, чтобы не было возможности взорвать память, когда прошло время, потому что простое использование памятки вокруг записей извлечения может привести к этому, рано или поздно, верно?
Может быть, вы могли бы попробовать альтернативный подход: пусть fetch-посты будут "чистыми", не запоминающими. В этом сценарии кто-то может вызывать посты выборки вслепую, не опасаясь OutOfMemoryExceptions.
Действительно, возможно, для некоторых случаев использования может быть достаточно «кэшировать значение» в локальном коде вызова.
Но на этом история не заканчивается, иначе я бы не стал отвечать :-): вы можете довольно легко запоминать свои «локализованные во времени» заметки, перепривязывая fetch-сообщения с помощью clojure.core / binding: from тогда весь код в том же потоке в стеке вызовов получит выгоду от связанных записанных записей извлечения.
Если вы используете альфа-версию clojure 1.3, вам необходимо объявить переменную fetch-posts явно как повторно привязываемую через метаданные: dynamic.
;; most simple definition
(defn ^:dynamic fetch-posts [& options]
(let [options (apply array-map options)]
(fetch :posts options)))
;; a la carte caching by the calling code (lexically scoped)
(let [posts (apply fetch-posts options)] ...)
;; a la carte caching by the calling code (dynamically scoped)
(binding [fetch-posts (memoize fetch-posts)] ...)
Моим последним предположением было бы то, что вы захотите «помнить» в постах, в вашей исходной версии, путем индексации постов по ключу, который будет опцией seq, верно? Некоторые, может быть, ваш код был не прав? (или вы предполагали, что fetch-posts будут вызываться с одинаковыми аргументами снова и снова?)
Другая идея. Используйте агент для сериализации доступа на запись к сообщениям, а затем убедитесь, что вызов выборки выполняется только тогда, когда он равен nil:
(def posts (agent nil))
(defn reset-posts [] (send posts (constantly nil)))
(defn fetch-posts [& options]
(let [options (apply array-map options)]
(send-off posts #(or % (fetch :posts options)))
(await-for (Long/MAX_VALUE) posts)
@posts))