这个Clojure代码输出32而我期望100.为什么会这样?使用计数器进行循环的好方法是什么?
(def t 0)
(for [i (range 100)]
(def t (+ 1 t))
)
(println t)
答案 0 :(得分:5)
for
评估为懒惰序列。由于称为分块的东西,你在这里很幸运,for
被分成32个元素的惰性分区。
您问题中的代码非常不恰当。
在您的情况下,您只需拨打(println 100)
如果您想循环某个副作用的序列,那么您可以使用doseq
(doseq [i (range 100)]
(println i))
;; or
(dotimes [i 100]
(println i))
答案 1 :(得分:5)
一些注释:
这是一种更恰当的方式来获得你想要的东西:
; a more functional way
(def t (reduce + (take 100 (repeat 1))))
(println t)
; a more "stateful" approach
(def t (atom 0))
(doseq [i (range 100)]
(swap! t inc))
(println @t)