欢迎!请参阅 关于 页面了解此工作的更多信息。
eduction 期望其源集合为可迭代(链接:1),其打印方法通过打印顺序(链接:2)。这暗示了一个可能限制对虚拟集合进行 eduction 应用的承诺,例如一个由 I/O 或其他资源支持的纯 IReduceInit 源。我发现在构建这些 I/O Reducible 并用 eduction 包装它们非常有用。但当在 REPL 进行交互时,打印被 eduction 包装的 IReduceInit 将失败。eduction 的打印方法实现要求太多吗?这只是一个微不足道的不便,显然我可以创建自己的 eduction 风味。
一个完全虚构的例子
`(defn database-index[name](reify clojure.lang.IReduceInit
`
(reduce [_ f init] (with-open [rdr (fressian/create-reader (io/input-stream name))] (loop [] ...reduce impl...)))))
(eduction (filter (as-of #inst "2012-01-01")) (database-index "eavt.fress"));; ^ 当在 repl 中打印时抛出异常 `
(链接:1) https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L7336-L7338(链接:2) https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L7360
建议方法 由于我们有 #object 标记的引文,让 eduction 打印像一个不透明的 #object