我想"更新"在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 不会在子程序范围之外更新。它的写作只是因为它与我目前的正确#34;相比更清晰。实现。预期结果是:
{:key1 "value1" :key2 "value2" :key3 "value3"}
我的问题是,用clojure方式完成任务的最佳方法是什么。
我考虑过嵌套一些 let 表达式,其中每个 let 可以保存更新的 a-map 的结果。我还考虑使用 loop-recur 结构,其中 a-map 作为绑定传递。但这两种方法看起来都不整洁。
任何建议都将受到赞赏。
干杯
编辑:为问题添加约束。函数foo1, foo2, foo3
实际上需要的参数多于a-map
。其中一些参数只能通过处理传递给-main
的参数来确定。
答案 0 :(得分:2)
assoc
会返回更新后的地图,以便您可以使用->
线程宏链接来电:
(let [a-map (-> {}
foo1
foo2
foo3)] ...)
或者您可以使用comp
:
(let [a-map ((comp foo3 foo2 foo1) {})]...)