如果我有一个功能列表:
(def lst '(+ -))
我希望将该列表中的第一个(+)应用于数字列表,我会认为它
(apply (first lst) '(1 2 3 4))
但显然你错了?语法错误我假设。我该怎么做?
PS:
=>(first lst)
+
=>(apply (first lst) '(1 2 3 4))
4
两者都没有错误地返回,它们只返回我在第一种情况下所期望的内容,以及我在第二种情况下不会期望的内容。
答案 0 :(得分:13)
由于您的列表被引用:
(def lst '(+ -))
; ^- quote!
其成员是两个符号,而不是函数。 Clojure中的符号可以用作函数,但它的行为非常类似于关键字(即在其参数中查找自己):
('foo {'foo 1})
; => 1
正确的解决方案是使用一个列表 - 或者更通俗地说,是一个向量 - 的函数:
(def lst (list + -)) ; ok
; or...
(def lst `(~+ ~-)) ; very unusual in Clojure
; or...
(def lst [+ -]) ; the idiomatic solution
然后您的apply
示例将有效。
顺便说一下,注意一个函数,当被REPL打印回来时,看起来不像是命名它的符号:
user=> +
#<core$_PLUS_ clojure.core$_PLUS_@10c10de0>