这是我上一个问题here的扩展。
目的如下:
(defn foo
[x a-map]
(assoc a-map x "value"))
(defn -main
[x]
(let [[x1 x2 x3 ... xn] x]
(-> {}
(partial foo x1)
(partial foo x2)
(partial foo x3)
...
(partial foo xn))))
这个问题的复杂性在于我必须填充可变数量的部分函数,因此我不能使用->
或' comp'。 foo
函数的实际机制当然不是assoc
,因此我无法将问题简化为zipmap
。
我不确定这是否重要,但输入参数x
实际上是两个序列的笛卡尔积。因此x
的每个元素都是一个双元素向量,它遍历两个序列的笛卡尔积空间。它是使用for
循环生成的,或者说是列表推导。
你有什么建议来处理这个问题?如果我没有提供一些重要信息,请告诉我。
干杯
答案 0 :(得分:1)
首先,您对thread first ->
macro的使用不正确(有关详细信息,请参阅this question)。以下是使用thread last ->>
macro的正确语法:
(->> {}
(foo x1)
(foo x2)
(foo x3)
(foo x4))
但是,除非向量x
的长度是阻止的,否则它不会起作用。
但是你可以在这里使用reduce
function来处理任何元素序列:
(reduce #(assoc %1 %2 "value") {} x)
这是一个完整的示例(稍加重新定义的foo
函数):
(defn foo
[a-map x] ; reversed order of arguments
(assoc a-map x "value"))
(defn -main
[x]
(reduce foo {} x))