在这种情况下,我应该如何处理 Clojure 中的可变状态?
How should I handle mutable state in Clojure in this case?
总的来说,我对 Clojure 和 LISP 还很陌生,所以如果这个问题听起来有点傻,请提前原谅我。我最近以 MVC 方式在 Java 中创建了一个回合制视频游戏,其中一个线程负责图形循环(因此,以固定速率更新屏幕上图形实体的几何状态),以及一个第二个线程负责处理游戏的逻辑状态;它的行为非常像一个守护进程:"sleeping" 在后台运行,除非请求做某事(详细说明用户输入),然后将 "change log" 传递给图形线程,以便它可以呈现对逻辑状态。所以游戏世界根本不是 "shared":只有逻辑线程可以访问它,图形线程的唯一职责是在初始化阶段之后以及当新的更改日志从逻辑线程。
我读到 Clojure 有变量、引用和原子。在这种情况下,我应该使用这些身份中的哪一个来将我的游戏世界状态存储在 Clojure 的逻辑线程中?
在您的情况下,不需要并发访问,因此任何选项都有效。
ref
是这个问题的过度。 var
通常不用于这种情况(通常 var 重新绑定用于可配置参数,而不是您的情况下的业务逻辑)。所以 atom
应该没问题。
编辑:(详细说明 var
)
var
,当声明为 ^:dynamic
(通常是 *earmuffed*
)时,是线程局部的。它可以有一个根绑定,每个线程都可以将它重新绑定到一个新的线程本地值。因此,您可以在 clojure 代码库中看到 var
的典型用法是 *warn-on-reflection*
、*unchecked-math*
等。它们主要以某种方式调整我们代码的行为。
因为只有一个线程处理 "board" 数据,所以 OK 无论如何都可以使用 var
,但看起来有点奇怪大部头书。看到 var
被如此频繁地更改,我有点不高兴。 :)
总的来说,我对 Clojure 和 LISP 还很陌生,所以如果这个问题听起来有点傻,请提前原谅我。我最近以 MVC 方式在 Java 中创建了一个回合制视频游戏,其中一个线程负责图形循环(因此,以固定速率更新屏幕上图形实体的几何状态),以及一个第二个线程负责处理游戏的逻辑状态;它的行为非常像一个守护进程:"sleeping" 在后台运行,除非请求做某事(详细说明用户输入),然后将 "change log" 传递给图形线程,以便它可以呈现对逻辑状态。所以游戏世界根本不是 "shared":只有逻辑线程可以访问它,图形线程的唯一职责是在初始化阶段之后以及当新的更改日志从逻辑线程。
我读到 Clojure 有变量、引用和原子。在这种情况下,我应该使用这些身份中的哪一个来将我的游戏世界状态存储在 Clojure 的逻辑线程中?
在您的情况下,不需要并发访问,因此任何选项都有效。
ref
是这个问题的过度。 var
通常不用于这种情况(通常 var 重新绑定用于可配置参数,而不是您的情况下的业务逻辑)。所以 atom
应该没问题。
编辑:(详细说明 var
)
var
,当声明为 ^:dynamic
(通常是 *earmuffed*
)时,是线程局部的。它可以有一个根绑定,每个线程都可以将它重新绑定到一个新的线程本地值。因此,您可以在 clojure 代码库中看到 var
的典型用法是 *warn-on-reflection*
、*unchecked-math*
等。它们主要以某种方式调整我们代码的行为。
因为只有一个线程处理 "board" 数据,所以 OK 无论如何都可以使用 var
,但看起来有点奇怪大部头书。看到 var
被如此频繁地更改,我有点不高兴。 :)