更新包装在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也可以工作。它创建所有不存在的键。