2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解此工作的更多信息。

0
Clojure

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

1 答案

0
参考: https://clojure.atlassian.net/browse/CLJ-1747 (由 gshayban 报告)
...