"Updating" Clojure 连续函数调用中的 map/data 结构

"Updating" a map/data structure in consecutive function calls in Clojure

我想 "update" 在 Clojure 中通过多次调用函数来绘制地图。思路表达如下:

(defn foo1
  [a-map]
  (assoc a-map :key1 "value1"))

(defn foo2
  [a-map]
  (assoc a-map :key2 "value2"))

(defn foo3
  [a-map]
  (assoc a-map :key3 "value3"))

(defn -main
  []
  (let [a-map {}]
    (do (foo1 a-map)
        (foo2 a-map)
        (foo3 a-map)
        a-map)))

显然这段代码是错误的,因为 a-map 没有在子例程范围之外更新。之所以这样写,是因为与我当前的 "correct" 实现相比,它更清晰。预期结果是:

{:key1 "value1" :key2 "value2" :key3 "value3"}

我的问题是,以 clojure 方式完成任务的最佳方式是什么。

我考虑过嵌套一些 let 表达式,其中每个 let 都可以保存更新后的 a-地图。我还考虑过使用 loop-recur 结构,其中 a-map 作为绑定传递。但是这两种方法看起来都不整洁。

如有任何建议,我们将不胜感激。

干杯

编辑:向问题添加约束。函数 foo1, foo2, foo3 实际上比 a-map 需要更多的参数。其中一些参数只能通过处理传递给 -main.

的参数来确定

assoc returns 更新的映射,因此您可以使用 -> 线程宏链接您的调用:

(let [a-map (-> {} 
                foo1
                foo2
                foo3)] ...)

或者您可以使用 comp:

(let [a-map ((comp foo3 foo2 foo1) {})]...)