Clojure新手在这里,我正在通过优秀的“Clojure从头开始”的帖子,并尝试了最后一次练习in this post。Alter vs Clojure通勤:我做错了什么?
当我将alter
替换为commute
时,总和不准确,但我不明白为什么。
(def work (ref (apply list (range 1e5))))
(def sum (ref 0))
(defn trans-alter [work sum]
(dosync
(if-let [n (first @work)]
(do
(alter work rest)
(alter sum + n)
(count @work))
0)))
(defn trans-commute [work sum]
(dosync
(if-let [n (first @work)]
(do
(commute work rest)
(commute sum + n)
(count @work))
0)))
(我已经跳过,设置了期货,并呼吁他们等的代码)
随着trans-alter
在这里我得到了4999950000
的总和(这是正确的预期值),而与trans-commute
我每次获得不同的值,但高于预期值(例如4999998211
)。
我在这里错过了什么?提前致谢!
提示:不要在交易中添加一笔金额,而是尝试将其结合到一个列表中,并查看实际得到的数字。 – Alex
谢谢,我试过了,发现有重复项,同一个号码被添加了两次。 – agam