0

我有这种情况。我使用 Clojure 中的 map 函数在集合上应用自定义函数。这个函数需要一段时间才能执行,而且我的集合非常大。我希望能够在每次调用我的函数时打印这样的内容:

"Doing some stuff... (index/total)"

其中 index 是集合中的当前元素,total 是大小。有没有办法在clojure中轻松做到这一点?我可以将大小作为参数发送到我的收藏。另外,我可能可以使用某种计数器,但我想知道是否有内置的东西......

谢谢

4

4 回答 4

1
(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)
于 2013-07-23T13:07:22.853 回答
1

其他答案将起作用,但您可能希望修改它们,以便总数只计算一次(即使用“(让 [cnt(计数集合)]...)。或者您可以查看clj-progress这是一个全功能进度报告库。

于 2013-07-23T11:14:53.670 回答
1

您可以将惰性计数器和大小序列传递到带有集合的映射中。

(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"])
于 2013-07-23T08:56:22.960 回答
1
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"])
于 2013-07-23T09:07:22.507 回答