【发布时间】:2011-01-02 15:14:14
【问题描述】:
我应该如何监控 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)
还有其他(更好的)方法可以达到这种效果吗?
我在做什么有什么陷阱吗? (我想我是在保持懒惰,例如不抱头。)
【问题讨论】:
标签: functional-programming lisp clojure imperative-programming