请在 2024 Clojure 状况调查! 中分享您的想法。

欢迎!有关如何使用本网站的更多信息,请参阅 关于 页面。

0
Clojure

eduction 期望其源集合是可迭代的(链接:1),其打印方法通过打印顺序(链接:2)。这隐含了一个可能限制将 eduction 应用于虚拟集合(例如由 I/O 或其他资源支持的纯 IReduceInit 源)的用例的承诺。我发现构造这些 I/O 可减少并将它们包装在 eduction 中很有用。但是,在与 REPL 交互时,打印出包装在 eduction 中的 IReduceInit 将失败。eduction 的打印方法实现需要太多吗?这只是一个额外的小不便,显然我也可以创建自己的版本 of 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"))
;; ^ 打印时抛出异常
`

(链接: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 报告)
...