如何在Clojure中构建复杂的"状态更新函数"?

4ZM*_*4ZM 3 design-patterns functional-programming clojure

我有一个游戏状态表示为地图和一些逻辑,在每个游戏'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)
Run Code Online (Sandbox Code Playgroud)

我并不真正关心中间状态,但使用 - >宏不起作用(因为有一些条件).

有效的黑客正在使用重置的本地原子!对于更新功能中的每个"行".但这不可能是它应该如何完成的?!

Dan*_*ero 6

我建议在一个名称很好的函数中提取每个步骤,这样你就可以使用 - >.伪代码:

(defn tic [g]
    (-> g
        inc-day
        random-weather
        grow-trees
        ...))
Run Code Online (Sandbox Code Playgroud)

对于任何条件逻辑,您可以执行与您在g2步骤中执行的操作类似的操作.

也许你会发现synthread lib很有用.我发现这个视频很有启发性.

再看看cond->看看你怎么能混合 - >和一些cond.例如,您的cond可能如下所示:

(cond-> g
        true (update-in [:day] inc)
        (some-cond) some-update-fund
        true (update-in [:fu] fu-update))
Run Code Online (Sandbox Code Playgroud)