如果我有一个功能列表:
(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)