¿Cómo debo controlar el progreso de una función mapeada en clojure?Clojure idiomático para informes de progreso?
Al procesar registros en un idioma imperativo, a menudo imprimo un mensaje de vez en cuando para indicar qué tan lejos han ido las cosas, p. informando cada 1000 registros. Esencialmente esto es contar repeticiones de bucle.
Me preguntaba qué enfoques podría llevar a esto en Clojure donde estoy mapeando una función sobre mi secuencia de registros. En este caso, imprimir el mensaje (e incluso contar el progreso) parece ser esencialmente un efecto secundario.
Lo que he encontrado hasta el momento parece:
(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)))
Por ejemplo:
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)
¿Hay otros (mejor) maneras de lograr este efecto?
¿Hay algún escollo en lo que estoy haciendo? (Creo que estoy conservando la pereza y no tomo la cabeza, por ejemplo.)
Creo que estoy haciendo algo crudamente similar arriba, adjuntando los informes a un seq con el que se podría hacer cualquier cosa. Estaba visualizando adjuntarlo a una secuencia de resultados, pero también podría ser la secuencia de entradas. Sin embargo, su código es mucho más agradable. No había progresado (perdón por el juego de palabras) a usar una devolución de llamada para el mensaje de informe (o una función más general) y estaba llamando a la función de informe para cada valor. –
¿Hay algún lugar que compartas para misc.clj? Sin duda me beneficiaría de ver otras ideas e implementaciones de cosas útiles como seq-counter –
sí, es realmente lo mismo que tu ejemplo inicial, fui un poco rápido en el "ohh eso en misk.clj" sin comprender correctamente la pregunta . http://code.google.com/p/cryptovide/source/browse/src/com/cryptovide/misc.clj. –