在Clojure中如何监控映射函数的进度?
在命令式语言中处理记录时,我经常打印一条消息来指示已经完成了多少工作,例如每处理1000个记录报告一次。实际上这是计数循环迭代。
我想知道在Clojure中,当我将一个函数映射到记录序列时,我可以采取哪些方法来监控进度。在这种情况下,打印消息(甚至保持进度计数)似乎基本上是副作用。
我目前想到的方案如下:
(defn report
[report-every val cnt]
(if (= 0 (mod cnt report-every))
(println "Done" cnt))
val)
(defn report-progress
[report-every aseq]
(map (fn [val cnt]
(report report-every val cnt))
aseq
(iterate inc 1)))
例如:user> (doall (report-progress 2 (range 10)))
Done 2
Done 4
Done 6
Done 8
Done 10
(0 1 2 3 4 5 6 7 8 9)
有没有其他更好的方法来实现这种效果?
我所做的是否存在任何潜在问题?(我认为我保留了lazy evaluation并且没有持有head,但是还有其他问题吗?)