除了标题中的一般问题外,
在问及Clojure的创作者Rich Hickey如何特别寻求驯服OO编程和可变状态的“偶然复杂性”时,我问这个问题。 Clojure的身份和状态分离很有意义(Hickey的ants.clj在研究列表中)。另一个相关的领域是使用游戏的函数式编程,这些游戏通常是模拟整个地方有很多有状态的“事物”;有一些关于FP和游戏的文章/论文,欢迎更多。
也许有经验的函数式程序员可以提供额外的背景和建议,如何将一个人的思维重新定位到功能风格,特别是模拟。提前谢谢!
答案 0 :(得分:5)
首先是Lau Jenson关于functional fluid dynamics的帖子(和代码)。虽然他肯定会在这里采用可变的速度路线,但风格相当实用。我敢打赌Clojure 1.3这可以完成(主要是!)不可改变的,具有合理的性能。
接下来是在Clojure中实现的simple Snake game。虽然在一个小时左右的时间内阅读起来很容易,但风格非常舒适和凝聚力。
此外,一些简洁的代码(我认为!)是代码建模神经网络。 Jeff Foster有一些single layer感知器代码,还有一些idiomatic revisions of the code。值得一看,即使你不熟悉NN。他还有一些关于流体动力学的最新帖子,尽管这次是在Haskell。 (Part I和Part II)我认为,同样有趣的是implementation of the Game of Life(& Part II)。
最后,正如Michal在我之前提到的,Brian Carper正在研究a RPG in Clojure。他为游戏recently posted some artwork,所以我打赌它仍在继续;)
我喜欢使用序列库来处理大量数据;使用像map
和reduce
这样的抽象,以及像juxt
这样有趣,方便的工具而不是简单的命令式迭代,感觉更自然。我发现,通过使用Clojure /功能语言重新实现众所周知且实施良好的命令式算法,您确实需要缴纳税款。
玩得开心!
答案 1 :(得分:4)
我不确定我是否能够对问题中提出的问题进行全面分析,但我至少可以在FP与游戏方面发布一些有趣的链接:
JörgW。Mittag在this answer中提供了许多关于“真实世界”Haskell编程问题的有趣例子(链接到一些有趣的文章 - Purely Functional Retrogames系列真的很值得阅读)。
在Clojure的土地上,Phil Hagelberg为他的PeepCode Clojure编程截屏录制了一个基于文本的冒险游戏;代码可用on GitHub。然后是Brian Carper的RPG project;没有公开发布的代码和刚刚发布的那篇文章(虽然看起来非常酷,所以让我们共同迫使Brian继续下去;-))。最后,here是一个使用Penumbra的简单游戏的例子(出于某种原因 - 可能与Clojure无关 - 我无法让它工作,但是你可能会这样做,另外还有一个附加的文章)。
至于模拟,研究ants.clj
是个好主意。另外,我记得在加州大学伯克利分校(我认为......?)的入门编程课程中可以看到一系列基于SICP的讲座(90%来自他们的YouTube频道);他们在Scheme中有三个关于OOP的讲座,我认为他们提到模拟作为一个领域,为该方法提供了良好的用例。请注意,我对这个内容非常模糊,所以我很难说它对你有多大用处。
答案 2 :(得分:4)
我正在用Clojure编写游戏,使用的功能主要是功能性的。例如,整个游戏状态被建模为不可变数据结构。
这需要一些稍微复杂的编码。例如,您经常最终创建具有大量参数的函数来传递游戏状态的各种元素,并确保在最新的游戏版本中应用游戏状态更新。
但它也带来了一些非常好的优点,例如并发已经证明是非常微不足道的,你可以做一些有趣的事情,比如克隆整个游戏状态以在AI中运行不同的模拟。
总的来说,我很高兴Clojure作为模拟/游戏的语言。
根据这些经验,我认为可以改善Clojure游戏/模拟的事情将是:
您可以在此处查看游戏的早期版本:Ironclad - Generals of Steam。它基本上是一个蒸汽朋克主题策略游戏。
答案 3 :(得分:3)
模拟是一种解释器形式 - 易于以功能样式书写。它们也可以设计为self-optimizing simulators,基于将它们视为编译器。
答案 4 :(得分:3)
答案 5 :(得分:3)
补充其他答案:有一个称为功能反应式编程的学科,它解决了系统的功能表示问题,这些系统随时间变化并对外部事件作出反应。参见