如果我有功能列表:
(def lst '(+ -))
我想将该列表中的第一个(+)应用于数字列表,我认为它是
(apply (first lst) '(1 2 3 4))
但显然你错了吗?我认为语法错误。我该怎么做呢?

PS:

=>(first lst)
+

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

两者都返回无错误,它们只是返回我在第一种情况下期望的结果,而在第二种情况下我不会期望的结果。

最佳答案

由于您的 list 被引用:

(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>

关于syntax - 首先在Clojure中应用功能列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3311331/

10-12 05:27