Dynamic Clojure中的动态原子

Dynamic Clojure中的动态原子,dynamic,clojure,binding,Dynamic,Clojure,Binding,我刚接触Clojure,对动态原子有点困惑。我想我了解动态绑定和原子的用例。但我经常看到这样的定义 (def ^:dynamic *variable* (atom nil)) 动态原子的用途是什么?动态变量用于共享线程内的状态。原子代表可能发生变化的变量。因此,包含atom的动态变量对于每个线程的作用域为且可能更改的状态非常有用。例如,可以方便地在HTTP处理程序中使用每个请求的数据。当然,您可以只使用动态变量和set它是一堆,因为您不需要跨线程进行协调。但是我们有比VAR更好的操作原子的功能

我刚接触Clojure,对动态原子有点困惑。我想我了解动态绑定和原子的用例。但我经常看到这样的定义

(def ^:dynamic *variable* (atom nil))

动态原子的用途是什么?

动态变量用于共享线程内的状态。原子代表可能发生变化的变量。因此,包含atom的动态变量对于每个线程的作用域为且可能更改的状态非常有用。例如,可以方便地在HTTP处理程序中使用每个请求的数据。当然,您可以只使用动态变量和
set它是一堆,因为您不需要跨线程进行协调。但是我们有比VAR更好的操作原子的功能,所以人们经常这样做。

我也是一个新手,使用Clojure 1.10,它似乎是
set绑定
范围之外)上的code>有问题。引用自:“目前,尝试使用set!设置var的根绑定是一个错误,即var分配是线程本地的。”我不明白的是,如果在任何情况下使用
atom
,为什么它仍然标记为
^:dynamic
?@fr13d您将使用
绑定建立每个线程的初始值,没有
设置,然后在该线程上使用
交换进一步对其进行变异