私はClojureでLandOfLispのオークバトルゲームを書き直しています。その過程で、私はより機能的なスタイルを使用しています。私は、より高いレベルのゲームループの一部を書くための2つの方法を考え出しました。1つはループ/繰り返しを含み、もう1つはdoseqとアトムを使用します。2つの機能は次のとおりです。
(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))
コードがより簡潔でわかりやすいので、2番目の方法の方が好きです。最初のアプローチが優れている理由はありますか?それとも私はこれを行うための別の方法を逃していますか?