"更新" Clojure中连续函数调用中的映射/数据结构

时间:2015-03-24 13:55:07

标签: clojure functional-programming

我想"更新"在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的参数来确定。

1 个答案:

答案 0 :(得分:2)

assoc会返回更新后的地图,以便您可以使用->线程宏链接来电:

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

或者您可以使用comp

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