有多种方法可以满足您的要求。这取决于你是否想要一个 惰性序列(你可能想要惰性,因为没有副作用,但如果你想要缓存密集的计算,你可能想要非惰性),或者如果您想要一个向量作为输出(与您的输入相同)。我会尽力按照你的想法去做。
您的 eval 地图对每个 fn 执行以下操作:
user=> (eval #(str 1))
#<user$eval1332$fn__1333 user$eval1332$fn__1333@38747597>
但是你想要类似下面的东西:
user=> (eval (#(str 1)))
"1"
您希望 eval 应用 fn,即:fn 应该是列表的第一个元素。让我们把它放在一个列表中:
user=> (map (comp eval list) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")
酷。但您可能想使用 apply 来代替 eval:
user=> (apply #(str 1))
; ArityException Wrong number of args (1)
起来!它失败了。 apply 没有 0-arity 重载,但我们可以传递一个空列表:
user=> (apply #(str 1) ())
"1"
好多了。让我们用地图来做吧:
user=> (map #(apply % ()) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")
或者更好的是,鉴于您的函数没有接收参数,您最好按照@Magos 的建议进行操作:
user=> (map #(%) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")