更新包装在atom中的Clojure映射
我正在尝试更新原子内部的贴图。每个贴图都由一个值引用更新包装在atom中的Clojure映射,clojure,Clojure,我正在尝试更新原子内部的贴图。每个贴图都由一个值引用 (def a (atom {})) (defn foo [id mps] (let [x (merge (get mps id) mps)] (swap! a assoc id x) x)) (foo 2 {:baz 88}) => {:baz 88} @a => {2 {:baz 88}} (foo 2 {:bar 99}) => {:bar 99} ?? @a => {2 {:bar 99}}
(def a (atom {}))
(defn foo [id mps]
(let [x (merge (get mps id) mps)]
(swap! a assoc id x) x))
(foo 2 {:baz 88}) => {:baz 88}
@a => {2 {:baz 88}}
(foo 2 {:bar 99}) => {:bar 99} ??
@a => {2 {:bar 99}} ??
它似乎正在覆盖地图,而不是更新地图。我想要的结果是:
(foo 2 {:baz 88}) => {:baz 88}
@a => {2 {:baz 88}}
(foo 2 {:bar 99}) => {:bar 99, :baz 88}
@a => {2 {:bar 99, :baz 88}}
如果您正在用新值替换旧值(使用
assoc
),则任何帮助都将非常有用。您正在寻找的是直接在atom上与()合并的行为。比如:
user=> (def a (atom {}))
#'user/a
user=> (swap! a #(merge-with merge % {:a {:b 1}}))
{:a {:b 1}}
user=> (swap! a #(merge-with merge % {:a {:c 2}}))
{:a {:c 2, :b 1}}
您正在用新值替换旧值(使用
assoc
)。您正在寻找的是直接在atom上与()合并的行为。比如:
user=> (def a (atom {}))
#'user/a
user=> (swap! a #(merge-with merge % {:a {:b 1}}))
{:a {:b 1}}
user=> (swap! a #(merge-with merge % {:a {:c 2}}))
{:a {:c 2, :b 1}}
您正在用新值替换旧值(使用
assoc
)。您正在寻找的是直接在atom上与()合并的行为。比如:
user=> (def a (atom {}))
#'user/a
user=> (swap! a #(merge-with merge % {:a {:b 1}}))
{:a {:b 1}}
user=> (swap! a #(merge-with merge % {:a {:c 2}}))
{:a {:c 2, :b 1}}
您正在用新值替换旧值(使用
assoc
)。您正在寻找的是直接在atom上与()合并的行为。比如:
user=> (def a (atom {}))
#'user/a
user=> (swap! a #(merge-with merge % {:a {:b 1}}))
{:a {:b 1}}
user=> (swap! a #(merge-with merge % {:a {:c 2}}))
{:a {:c 2, :b 1}}
assoc in
也应该可以工作。它会创建所有不存在的键。中的assoc也可以工作。它会创建所有不存在的键。
中的assoc也可以工作。它会创建所有不存在的键。
中的assoc也可以工作。它创建所有不存在的键。