design-patterns - 如何在 Clojure 中构造复杂的 "state updating functions"?

标签 design-patterns clojure functional-programming

我有一个表示为 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/

相关文章:

memory - Clojure STM 内存不足

programming-languages - 命令式语言中可以使用哪些函数式语言技术?

c# - MVC、MVP 和 MVVM 设计模式在编码 c# 方面有什么区别

C# 命令模式混淆

php - 工厂/抽象工厂混淆

clojure - 在 Clojure 中如何制作自己的 deftype refable?

java - 可插入的错误处理策略

list - 在 Clojure 中按键值过滤映射列表的简单方法

javascript - LazyEvaluation 的性能优势究竟从何而来?

javascript - 粗箭头与 map 的用法