在Clojure中首先应用函数列表

trh*_*178 7 syntax clojure

如果我有一个功能列表:

(def lst '(+ -))

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

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

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

PS:

=>(first lst)  
+

=>(apply (first lst) '(1 2 3 4))   
4
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*zyk 13

由于您的列表被引用:

(def lst '(+ -))
       ; ^- quote!
Run Code Online (Sandbox Code Playgroud)

它的成员是两个符号,而不是函数.Clojure中的符号可以用作函数,但它的行为非常类似于关键字(即在其参数中查找自己):

('foo {'foo 1})
; => 1
Run Code Online (Sandbox Code Playgroud)

正确的解决方案是使用一个列表 - 或者,更惯用的是一个向量 - 的函数:

(def lst (list + -)) ; ok
; or...
(def lst `(~+ ~-))   ; very unusual in Clojure
; or...
(def lst [+ -])      ; the idiomatic solution
Run Code Online (Sandbox Code Playgroud)

那你的apply例子就可以了.

顺便说一下,注意一个函数,当由REPL打印回来时,看起来不像是命名它的符号:

user=> +
#<core$_PLUS_ clojure.core$_PLUS_@10c10de0>
Run Code Online (Sandbox Code Playgroud)