繁体   English   中英

剂量期间的Clojure更新值

[英]clojure update value during doseq

在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))

您不必担心循环的最小开销。 分离不同的任务更为重要。 我非常喜欢您的第一个版本。

您的第二个版本可能看起来更好,但我仍然希望第一个版本。

(defn display-xs [xs]
  (let [n (atom 0)]
    (doseq [x xs]
      (swap! n + (count x))
      (println (string/join " " x)))
    (println "total: " @n)))

我稍微重写了您的代码,所以请展示我该怎么做:

(def sample-vals (repeatedly 10 #(range (+ 5 (rand-int 10)))))

(defn display-xs [xs]
  (let [n (atom 0)]
    (doseq [x xs]
       (swap! n + (count x))
       (println x))
    (println "total:" @n)))

(newline)
(display-xs sample-vals)

(defn print-n-sum [cum coll]
  (let [cnt  (count coll) ]
     (printf "%4d:  " cnt)
     (println  coll)
     (+ cum cnt)))

(defn calc-sum [xs]
  (let [n (reduce print-n-sum 0 xs) ]
    (println "total:" n)))

(newline)
(calc-sum sample-vals)

结果

> rs; lein run
(0 1 2 3 4 5 6 7 8 9)
(0 1 2 3 4 5 6 7 8 9 10 11)
(0 1 2 3 4 5 6 7 8 9 10)
(0 1 2 3 4 5 6 7 8 9 10 11)
(0 1 2 3 4)
(0 1 2 3 4 5 6 7 8 9 10 11)
(0 1 2 3 4 5)
(0 1 2 3 4 5 6 7 8 9 10)
(0 1 2 3 4 5 6)
(0 1 2 3 4 5 6 7 8 9 10)
total: 97

  10:  (0 1 2 3 4 5 6 7 8 9)
  12:  (0 1 2 3 4 5 6 7 8 9 10 11)
  11:  (0 1 2 3 4 5 6 7 8 9 10)
  12:  (0 1 2 3 4 5 6 7 8 9 10 11)
   5:  (0 1 2 3 4)
  12:  (0 1 2 3 4 5 6 7 8 9 10 11)
   6:  (0 1 2 3 4 5)
  11:  (0 1 2 3 4 5 6 7 8 9 10)
   7:  (0 1 2 3 4 5 6)
  11:  (0 1 2 3 4 5 6 7 8 9 10)
total: 97

请注意,您不必使用原子(此示例比ref简单)。 您可以进行打印和添加诸如print-n-sum类的单个功能,然后将其馈送给reduce

您可以在您的reduce append函数中打印它

(defn print-and-append [acc x]
      (println (string/join " " x))
      (+ acc (count x)))

(println (reduce print-and-append 0 xs))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM