Clojure 交换原子与映射值
Clojure swap atom with map values
我想assoc
将地图的值转化为atom
。
我可以这样做:
(defonce config (atom {}))
(swap! config assoc :a "Aaa")
(swap! config assoc :b "Bbb")
但它是重复的,多次调用 swap!
。
我想做这样的事情:
(swap! config assoc {:a "Aaa"
:b "Bbb"})
;; this doesn't work :
;; Exception in thread "main" clojure.lang.ArityException: Wrong number of args (2) passed to: core$assoc
我该怎么做?
请参阅 assoc
的文档:
=> (doc assoc)
-------------------------
clojure.core/assoc
([map key val] [map key val & kvs])
assoc[iate]. When applied to a map, returns a new map of the
same (hashed/sorted) type, that contains the mapping of key(s) to
val(s). When applied to a vector, returns a new vector that
contains val at index. Note - index must be <= (count vector).
nil
assoc
不带地图。它需要成对的键和值:
user=> (assoc {} :a 1 :b 2)
{:a 1, :b 2}
user=> (let [x (atom {})]
#_=> (swap! x assoc :a 1 :b 2)
#_=> x)
#object[clojure.lang.Atom 0x227513c5 {:status :ready, :val {:a 1, :b 2}}]
顺便说一句,您应该始终将对原子的更新隔离到单个 swap!
。通过如上所述进行两次交换,您允许其他线程可能破坏引用的数据。一个 swap!
使一切保持原子性。
N.B. merge
表现如你所想:
user=> (merge {} {:a 1 :b 1})
{:a 1, :b 1}
user=> (let [x (atom {})]
#_=> (swap! x merge {:a 1 :b 2})
#_=> x)
#object[clojure.lang.Atom 0x1be09e1b {:status :ready, :val {:a 1, :b 2}}]
我想assoc
将地图的值转化为atom
。
我可以这样做:
(defonce config (atom {}))
(swap! config assoc :a "Aaa")
(swap! config assoc :b "Bbb")
但它是重复的,多次调用 swap!
。
我想做这样的事情:
(swap! config assoc {:a "Aaa"
:b "Bbb"})
;; this doesn't work :
;; Exception in thread "main" clojure.lang.ArityException: Wrong number of args (2) passed to: core$assoc
我该怎么做?
请参阅 assoc
的文档:
=> (doc assoc)
-------------------------
clojure.core/assoc
([map key val] [map key val & kvs])
assoc[iate]. When applied to a map, returns a new map of the
same (hashed/sorted) type, that contains the mapping of key(s) to
val(s). When applied to a vector, returns a new vector that
contains val at index. Note - index must be <= (count vector).
nil
assoc
不带地图。它需要成对的键和值:
user=> (assoc {} :a 1 :b 2)
{:a 1, :b 2}
user=> (let [x (atom {})]
#_=> (swap! x assoc :a 1 :b 2)
#_=> x)
#object[clojure.lang.Atom 0x227513c5 {:status :ready, :val {:a 1, :b 2}}]
顺便说一句,您应该始终将对原子的更新隔离到单个 swap!
。通过如上所述进行两次交换,您允许其他线程可能破坏引用的数据。一个 swap!
使一切保持原子性。
N.B. merge
表现如你所想:
user=> (merge {} {:a 1 :b 1})
{:a 1, :b 1}
user=> (let [x (atom {})]
#_=> (swap! x merge {:a 1 :b 2})
#_=> x)
#object[clojure.lang.Atom 0x1be09e1b {:status :ready, :val {:a 1, :b 2}}]