Tôi nên theo dõi tiến độ của hàm được ánh xạ trong clojure như thế nào?Clojure thành ngữ để báo cáo tiến độ?
Khi xử lý hồ sơ theo ngôn ngữ bắt buộc, tôi thường xuyên in một tin nhắn thường xuyên để cho biết mọi thứ đã biến mất bao lâu, ví dụ: báo cáo mỗi 1000 hồ sơ. Về cơ bản điều này là đếm lặp lại vòng lặp.
Tôi đã tự hỏi những cách tiếp cận nào tôi có thể thực hiện điều này trong clojure, nơi tôi đang ánh xạ một hàm trên chuỗi bản ghi của mình. Trong trường hợp này, in thông báo (và thậm chí giữ số lượng tiến bộ) dường như là những tác dụng phụ cơ bản.
Những gì tôi đã đưa ra cho đến nay trông giống như:
(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)))
Ví dụ:
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)
Có khác (tốt hơn) cách để đạt được hiệu ứng này?
Có bất kỳ cạm bẫy nào trong những gì tôi đang làm không? (Tôi nghĩ rằng tôi đang giữ gìn sự lười biếng và không giữ đầu ví dụ.)
Tôi nghĩ rằng tôi đang làm một cái gì đó thô lỗ tương tự ở trên, đính kèm báo cáo vào một seq mà bất cứ điều gì có thể được thực hiện. Tôi đã hình dung gắn nó vào một chuỗi các kết quả nhưng nó cũng có thể là chuỗi đầu vào. Mã của bạn đẹp hơn nhiều. Tôi đã không tiến bộ (tha thứ cho việc chơi chữ) để sử dụng một cuộc gọi lại cho thông điệp báo cáo (hoặc chức năng tổng quát hơn) và tôi đã gọi hàm báo cáo cho mọi giá trị. –
Có bất kỳ nơi nào bạn chia sẻ cho misc.clj không? Tôi chắc chắn sẽ được hưởng lợi từ việc xem các ý tưởng khác và triển khai các nội dung hữu ích như truy cập –
có nghĩa là nó thực sự giống như ví dụ ban đầu của bạn, tôi đã có một chút nhanh trên "ohh thats in misk.clj" với hiểu đúng cách câu hỏi . http://code.google.com/p/cryptovide/source/browse/src/com/cryptovide/misc.clj. –