Comment surveiller la progression d'une fonction mappée dans clojure?Clojure idiomatique pour les rapports de progrès?
Lors du traitement d'enregistrements dans un langage impératif, j'imprime souvent un message de temps en temps pour indiquer à quel point les choses sont allées, par ex. rapports tous les 1000 enregistrements. Essentiellement, cela compte les répétitions de boucles. Je me demandais quelles approches je pourrais prendre à cela dans clojure où je suis la cartographie d'une fonction sur ma séquence d'enregistrements. Dans ce cas, l'impression du message (et même le compte de la progression) semblent être essentiellement des effets secondaires.
Ce que je suis venu avec l'air si loin comme:
(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)))
Par exemple:
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)
Y at-il d'autres (mieux) les moyens de parvenir à cet effet?
Y a-t-il des pièges dans ce que je fais? (Je pense que je suis de préserver la paresse et ne pas tenir la tête par exemple.)
Je pense que je fais quelque chose de grossièrement similaire ci-dessus, en attachant le rapport à un seq avec lequel tout peut être fait. J'envisageais de l'attacher à une suite de résultats mais cela pourrait tout aussi bien être la séquence d'entrées. Votre code est bien plus agréable. Je n'avais pas progressé (pardonnez le jeu de mots) en utilisant un rappel pour le message de rapport (ou une fonction plus générale) et j'appelais la fonction de rapport pour chaque valeur. –
Y a-t-il quelque part que vous partagez pour misc.clj? Je profiterais certainement de voir d'autres idées et implémentations de trucs utiles comme seq-counter –
oui c'est vraiment le même que ton premier exemple, j'étais un peu rapide sur le "ohh c'est dans misk.clj" sans bien comprendre la question . http://code.google.com/p/cryptovide/source/browse/src/com/cryptovide/misc.clj. –