【发布时间】:2016-10-25 16:30:17
【问题描述】:
在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))
【问题讨论】:
-
如果我是你,我不会被第一个版本所困扰。除非您正在寻找性能(在这种情况下,是基准)。
-
你的 sn-p 在结尾加上
reduce对我来说似乎非常好。
标签: clojure