我應該如何監視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