拥有一组文件/目录我想创建所有叶子文件的集合。 我希望得到的集合扩展了clojure.core.protocols / CollReduce协议。
我是否需要扩展协议或是否有辅助函数?
换句话说。减速器只能帮助并行减少,还是我可以使用它们来并行地有效地生成可简化的集合?
为了说明这个问题让我展示可以工作的实现,授予文件层次结构不超过两个级别(例如我们的集合可以包含文件和目录,但目录只能包含文件)
(ns user
[import [java.io File]])
(defn expand [reduction-function]
(fn [result input]
(if (.isFile input)
(reduction-function result input)
; if not a file we assume it's a directory
(reduce reduction-function result (.listFiles input)))))
(defn process [xfn c]
(lazy-seq (when-let [s (seq c)]
(concat ((xfn #(concat %1 (list %2))) '() (first s))
(process xfn (rest s))))))
(def f (File. "C:\\WORK"))
(process expand [f]) ; => produces list of files
现在,将扩展定义为类似递归的样式(或者更确切地说是一系列转换)会很好,因此它适用于所有级别,但是以并行方式执行。与reducers一样,我们可以在reduce中定义提前终止,我希望能够定义生成(集合扩展),当满足某些条件时(在文件示例中到达目录层次结构树中的文件),该生成停止(
)