Concurrency 为什么要交换!即使原子';s值为';你没变吗?
假设我有以下一段(人为的)Clojure代码:Concurrency 为什么要交换!即使原子';s值为';你没变吗?,concurrency,clojure,Concurrency,Clojure,假设我有以下一段(人为的)Clojure代码: (def c (clojure.lang.Atom. [nil nil])) (swap! c (fn [[x y]] ["done", (second (swap! c (fn [[x y]] [x y])))])) 我希望这项工作如下: Clojure取消装箱c以查找[nil nil],并将其传递给外部fn 外部fn调用交换,它取消装箱c以查找[nil nil],并将此值传递给内部fn 内部fn返回[nil nil]。
(def c (clojure.lang.Atom. [nil nil]))
(swap! c
(fn [[x y]]
["done", (second (swap! c (fn [[x y]] [x y])))]))
我希望这项工作如下:
c
以查找[nil nil]
,并将其传递给外部fn
fn
调用交换
,它取消装箱c
以查找[nil nil]
,并将此值传递给内部fn
fn
返回[nil nil]
。对交换的内部调用代码>将该值替换为c
的新值
fn
返回值[“done”nil]
交换代码>尝试比较和设置代码>,并看到c
的当前值[nil nil]
与旧值[nil nil]
相同,因此它成功地在[“done”nil]
中交换
为什么会这样?我的心智模型缺少了什么?Clojure Slack上的几个人帮助我了解了这里发生了什么(谢谢!)<代码>比较和设置使用
相同?
(即Java引用相等)来比较atom的新旧值。每次我重新创建向量时,我都会创建一个新对象,它与旧对象不同。即使我没有想到内部交换从技术上讲,它是变异的