doseqの間に変数を更新/計算する最良の方法は何ですか?投与量中の値の更新
はもちろん、私はちょうど次の操作を行うことができます:
(doseq [x xs]
(println (string/join " " x)))
(println "total:" (reduce + 0 (map count xs)))
しかし、私は値を計算するために最後にリスト全体にわたりマッピングすることを避けるためにしたい...それはちょうど数を更新するために、より理にかなっています繰り返す
私はこのがであることを発見しましたが、それはちょっとしたひどいもののようです。
(defn display-xs [xs]
;; all I want to do is update a count while I print,
;; and have that value available afterwards!
(let [n (ref 0)]
(do
(doseq [x xs]
(dosync
(ref-set n (+ @n (count x)))
(println (string/join " " x))))
(println "total:" @n))))
私はdoseq
が:let
することができますが、doseqが終了した後、私は値が必要であることを知っています。
それとも
(println "total:" (reduce (fn [m x] (do (println x) (+ m (count x)))) 0 xs))
でそれを印刷することができます。パフォーマンスを探している場合を除き(この場合、ベンチマーク) – nha
最後の 'reduce 'を使ってあなたのスニペットは私にとって完全に良いようです。 – amalloy