2017-08-03 15 views
1

我的问题是关于clojure原子中嵌套的map/key以及如何同时更新它们。在我的情况下,我在另一张地图上有一个嵌套地图,这是一个持有小游戏原子的状态。在一个交换中的多个关联!操作,例如。更新x,y的同时点

这是我的原子:

(def state (atom {:mousePos {:x 0 :y 0} 
        :playArea {:width 10000 :height 10000} 
        :player {:zoomOut 7.5 
          :cells [{:center {:x 1234 :y 5678} 
            :radius 17.84124116 
            :area 1000}] 
          :gravityCenter {:x 1234 :y 5678} 
          :gravityRadius 17.84124116}})) 

而在这个原子我想更新在同一时间mousePos结构x和y的值,以确保它们的一致性/并发性。

目前我做:

(swap! state assoc-in [:mousePos :x] mouseX) 
(swap! state assoc-in [:mousePos :y] mouseY) 

但是这是两个交换的理论上如果线程在哪里我之间切换的可能的问题结束了,对于下面的操作在另一个线程中,我会使用当前的x,但鼠标的旧y位置,我不希望这样。

所以我希望做这样的事情:

(swap! state assoc-in [:mousePos :x] mouseX 
         [:mousePos :y] mouseY) 

当然女巫将无法正常工作,所以我尝试写我自己的assoc命令功能于MULT功能,那就是在那里我unsuccessfull。

+1

我建议你改一下你的标题来描述你的“实际问题”,并把在顶部。旧帖子可能很有参考价值,但并非绝对必要。你能提供一个链接吗?如果你已经删除了它,你可以撤消删除并自己回答。 –

+0

也可以使用:mouse-pos Clojure约定,而不是:mousePos –

+1

[Clojure中的调试?]的可能的重复(https://stackoverflow.com/questions/2352020/debugging-in-clojure) –

回答

1

当update-in与您的使用模式不符时,因为您在这里想要更新多个值,那么更通用的update-inupdate函数往往可以正常工作。

user> (def state (atom {:mousePos {:x 0 :y 0}})) 
#'user/state 
user> (swap! state update-in [:mousePos] assoc :x 123 :y 321) 
{:mousePos {:x 123, :y 321}} 

,或者当你只有一个凯在更新路径:

user> (swap! state update :mousePos assoc :x 123 :y 321) 
{:mousePos {:x 123, :y 321}} 
+0

谢谢,这个作品非常漂亮。 – Andimanos

相关问题