(def ops '(+ - * /))
(map #(% 2 5) ops)
(5 5 5 5)
这是没有道理给我。为什么这会返回一个5的列表而不是函数调用的结果?
(def ops '(+ - * /))
(map #(% 2 5) ops)
(5 5 5 5)
这是没有道理给我。为什么这会返回一个5的列表而不是函数调用的结果?
问题是'(+ - * /)
是一个符号列表,而不是函数列表。符号实现了AFn
,并且当提供两个参数时,函数将尝试在第一个参数(此处为2
)中查找符号,并在查找失败时返回第二个参数(此处为5
)。
有Clojure中没有你想要的正是一个功能:juxt
:http://clojuredocs.org/clojure.core/juxt
所以,你的例子是
(def funcs (juxt + - * /))
(funcs 2 5)
如果有人想出了一个很好的解释了为什么map
方法不工作我也想听到。
这工作:(map #(% 2 5) [+ - * /])
这不:(map #(% 2 5) '[+ - * /])
也没有这样的:(map #(% 2 5) '(+ - * /))
的原因是,当你做'(+ - * /)
,你得到的符号列表+, - *和/而不是它们所指的功能 - 报价也适用于列表的值。
使用矢量可以避免这个问题。
如果您绝对想要一个列表,请执行(map #(% 2 5) (list + - * /))
。
这是对我的问题更深入的回答,补充了@bsvingen提供的解决方案。 – user40129