我有一个表示为 map 的游戏状态和一些更新每个游戏“tic”状态的逻辑。但我无法弄清楚如何以任何理智的方式构建更新函数。
这样构造函数的惯用模式是什么?
这是我想做的一些伪代码:
(defn tic [g] "Return an updated game"
g1 = (update-in g [:day] inc)
g2 = (if (some-cond) (some-update-func g1) g1)
g3 = (update-in g2 [:fu] fu-update)
... many more ...
g-last)
我并不真正关心中间状态,但是使用 -> 宏不起作用(因为有一些条件)。
一个有效的方法是使用一个被重置的本地原子!对于更新函数中的每个“行”。但这不可能是它应该做的?!
最佳答案
我建议将每个步骤提取到一个命名良好的函数中,以便您可以使用 ->。伪代码:
(defn tic [g]
(-> g
inc-day
random-weather
grow-trees
...))
对于任何条件逻辑,您都可以执行与您在 g2 步骤中执行的操作类似的操作。
也许你会发现synthread lib有用。我找到了 this video很有启发性。
另请查看 cond->看看你怎么能混合 -> 与一些条件。例如,您的 cond 可能如下所示:
(cond-> g
true (update-in [:day] inc)
(some-cond) some-update-fund
true (update-in [:fu] fu-update))
关于design-patterns - 如何在 Clojure 中构造复杂的 "state updating functions"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746193/