我一直在用 Clojure 重写 Land Of Lisp 的兽人战斗游戏。在此过程中,我使用了更实用的样式。我想出了两种方法来编写更高级别的游戏循环的一部分。一个涉及循环/递归,另一个使用doseq 和atoms。下面是两个函数:
(defn monster-round [player monsters]
(loop [n 0 p player]
(if (>= n (count monsters))
p
(recur (inc n)
(if (monster-dead? (nth monsters n))
p
(let [r (monster-attack (nth monsters n) p)]
(print (:attack r))
(:player r)))))))
(defn monster-round-2 [player monsters]
(let [p (atom player)]
(doseq [m monsters]
(if (not (monster-dead? m))
(let [r (monster-attack m @p)]
(print (:attack r))
(reset! p (:player r)))))
@p))
我更喜欢第二种方法,因为代码更简洁,更容易理解。第一种方法更好有什么理由吗?还是我错过了另一种方法来做到这一点?