【发布时间】:2015-03-24 13:55:07
【问题描述】:
我想在 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 没有在子例程范围之外更新。之所以这样写,只是因为与我当前的“正确”实现相比,它更清晰。预期结果是:
{:key1 "value1" :key2 "value2" :key3 "value3"}
我的问题是,以 clojure 方式完成任务的最佳方式是什么。
我考虑过嵌套几个 let 表达式,其中每个 let 可以保存更新后的 a-map 的结果。我还考虑使用 loop-recur 结构,其中 a-map 作为绑定传递。但是这两种方法看起来都不整洁。
任何建议将不胜感激。
干杯
编辑:为问题添加约束。函数foo1, foo2, foo3 实际上比a-map 需要更多的参数。而其中一些参数只能通过处理传递给-main的参数来确定。
【问题讨论】:
标签: clojure functional-programming