我应该如何监视clojure中映射函数的进度?进展报告的习惯性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)
正在实现这种效果的还有其他(更好)的方式?
我在做什么有什么陷阱? (我认为我保留了懒惰,而不是头脑风暴)
我想我正在做一些与上面类似的事情,将报告附加到可以完成任何事情的seq。我设想将它附加到一系列结果中,但它同样可以是输入序列。 虽然你的代码更好。我没有取得进展(赦免双关语言)使用报告消息的回调(或更通用的功能),并且我正在为每个值调用报告功能。 – 2010-01-07 20:33:53
是否有你分享misc.clj的任何地方?我肯定会从看到seq-counter – 2010-01-07 20:36:42
等有用的东西的其他想法和实现中受益,是的,它与您的初始示例相同,我对“misk.clj中的ohh thats”有一点点了解,但没有正确理解问题。 http://code.google.com/p/cryptovide/source/browse/src/com/cryptovide/misc.clj。 – 2010-01-07 22:05:35