"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) {})]...)
我想 "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) {})]...)