(def ops '(+ - * /))
(map #(% 2 5) ops)
给出
(5 5 5 5)
这对我没有意义。为什么返回5的列表而不是函数调用的结果?
答案 0 :(得分:12)
这有效:(map #(% 2 5) [+ - * /])
这不是:(map #(% 2 5) '[+ - * /])
这也不是:(map #(% 2 5) '(+ - * /))
原因是当你执行'(+ - * /)
时,你得到符号+, - *和/的列表,而不是它们引用的函数 - 引用也适用于列表的值。 / p>
使用矢量可以避免这个问题。
如果您绝对需要列表,请执行(map #(% 2 5) (list + - * /))
。
答案 1 :(得分:7)
问题是'(+ - * /)
是符号列表,而不是函数列表。符号实现AFn
,当提供两个参数时,函数尝试在第一个参数中查找符号(此处为2
)并返回第二个参数(此处为5
)失败。
答案 2 :(得分:4)
clojure中有一个功能可以完全符合您的要求:juxt
:http://clojuredocs.org/clojure.core/juxt
所以你的例子就是
(def funcs (juxt + - * /))
(funcs 2 5)
如果有人提出一个很好的解释,为什么map
方法不起作用,我也希望听到。