Как мне отслеживать ход отображаемой функции в 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)
Существуют ли другие (лучшие) способы достижения этого эффекта?
Есть ли какие-то подводные камни в том, что я делаю? (Я думаю, что я сохраняю лень и не удерживаю голову, например.)