将一个函数列表应用于参数,clojure

use*_*129 6 clojure

(def ops '(+ - * /))
(map #(% 2 5) ops)
Run Code Online (Sandbox Code Playgroud)

(5 5 5 5)
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.为什么这会返回5的列表而不是函数调用的结果?

bsv*_*gen 12

这有效: (map #(% 2 5) [+ - * /])

这不是: (map #(% 2 5) '[+ - * /])

这也不是: (map #(% 2 5) '(+ - * /))

原因是当你这样做时'(+ - * /),你得到一个符号+, - *和/的列表,而不是它们引用的函数 - 引用也适用于列表的值.

使用矢量可以避免这个问题.

如果你绝对想要一个清单,那就做吧(map #(% 2 5) (list + - * /)).


Lee*_*Lee 7

问题是这'(+ - * /)是一个符号列表,而不是一个函数列表.符号实现AFn,当提供两个参数时,该函数尝试在第一个参数(2此处)中查找符号,5如果查找失败则返回第二个参数(此处).