在Clojure中首先应用函数列表

时间:2010-07-22 16:56:16

标签: syntax clojure

如果我有一个功能列表:

(def lst '(+ -))

我希望将该列表中的第一个(+)应用于数字列表,我会认为它

(apply (first lst) '(1 2 3 4))

但显然你错了?语法错误我假设。我该怎么做?

PS:

=>(first lst)  
+

=>(apply (first lst) '(1 2 3 4))   
4

两者都没有错误地返回,它们只返回我在第一种情况下所期望的内容,以及我在第二种情况下不会期望的内容。

1 个答案:

答案 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>