我有这种情况。我使用 Clojure 中的 map 函数在集合上应用自定义函数。这个函数需要一段时间才能执行,而且我的集合非常大。我希望能够在每次调用我的函数时打印这样的内容:
"Doing some stuff... (index/total)"
其中 index 是集合中的当前元素,total 是大小。有没有办法在clojure中轻松做到这一点?我可以将大小作为参数发送到我的收藏。另外,我可能可以使用某种计数器,但我想知道是否有内置的东西......
谢谢
我有这种情况。我使用 Clojure 中的 map 函数在集合上应用自定义函数。这个函数需要一段时间才能执行,而且我的集合非常大。我希望能够在每次调用我的函数时打印这样的内容:
"Doing some stuff... (index/total)"
其中 index 是集合中的当前元素,total 是大小。有没有办法在clojure中轻松做到这一点?我可以将大小作为参数发送到我的收藏。另外,我可能可以使用某种计数器,但我想知道是否有内置的东西......
谢谢
(defn map-reporting
[msg f coll]
(let [c (count coll)]
(doall (map-indexed (fn [e i]
(println msg (str "[" (inc i) "/" c "]"))
(f e)) coll))))
user> (map-reporting "Doing some stuff" inc (range 5))
Doing some stuff [1/5]
Doing some stuff [2/5]
Doing some stuff [3/5]
Doing some stuff [4/5]
Doing some stuff [5/5]
(1 2 3 4 5)
其他答案将起作用,但您可能希望修改它们,以便总数只计算一次(即使用“(让 [cnt(计数集合)]...)。或者您可以查看clj-progress这是一个全功能进度报告库。
您可以将惰性计数器和大小序列传递到带有集合的映射中。
(defn sebi [collection]
(map #(println (format "Doing some staff with %s (%d/%d)" %1 (inc %2) %3))
collection
(range)
(repeat (count collection)))
(sebi ["Mary" "had" "a" "little" "lamb"])
user=> (map-indexed (fn [idx itm] [idx itm]) "foobar")
([0 \f] [1 \o] [2 \o] [3 \b] [4 \a] [5 \r])
(defn sebi [collection]
(map-indexed #(println (format "Doing some stuff with %s (%d/%d)"
%2 (inc %1) (count collection)))
collection))
(sebi ["Mary" "had" "a" "little" "lamb"])