Function 克洛尤尔先休息

Function 克洛尤尔先休息,function,clojure,symbols,Function,Clojure,Symbols,为什么我会得到两个不同的值 (apply (first '(+ 1 2)) (rest '(+ 1 2))) > 2 及 什么时候 及 我试着减少,得到了同样的值 (reduce (first '(+ 1 2)) (rest '(+ 1 2))) > 2 (第一个“(+12))是一个符号 user=> (class (first '(+ 1 2))) clojure.lang.Symbol user=> (apply (symbol "+") [1 2]) 2 use

为什么我会得到两个不同的值

(apply (first '(+ 1 2)) (rest '(+ 1 2)))
> 2

什么时候

我试着减少,得到了同样的值

(reduce (first '(+ 1 2)) (rest '(+ 1 2)))
> 2
(第一个“(+12))是一个符号

user=> (class (first '(+ 1 2)))
clojure.lang.Symbol
user=> (apply (symbol "+") [1 2])
2
user=> (apply (eval (symbol "+")) [1 2])
3
user=> (apply (eval (first '(+ 1 2))) (rest '(+ 1 2)))
3

user=> (class (first [+ 1 2]))
clojure.core$_PLUS_
user=> (apply (first [+ 1 2]) (rest '(+ 1 2)))
3

您的问题是您试图调用符号
'+
,而不是函数
+
。调用符号时,它会尝试在第一个参数中查找符号(例如,如果它是
{'a1'+5'b2}
,则会得到
5
)。如果传递第二个参数,如果在第一个参数中找不到符号,则返回该值,而不是
nil
。因此,当您调用
('+12)
,它尝试在1中查找
'+
,但失败,因此返回2

顺便说一句,这就是使用
'(+12)
(list+12)
创建列表的区别。前者创建符号+、1和2的列表。因为1和1是一样的,没关系。但是符号“+”不是Var clojure.core/+,因此后者获取Var的值,而前者仅获取符号。因此,如果您完成了
(list+12)
,您的代码就可以像编写的那样工作了

(rest '(+ 1 2))
> (1 2)
(reduce (first '(+ 1 2)) (rest '(+ 1 2)))
> 2
user=> (class (first '(+ 1 2)))
clojure.lang.Symbol
user=> (apply (symbol "+") [1 2])
2
user=> (apply (eval (symbol "+")) [1 2])
3
user=> (apply (eval (first '(+ 1 2))) (rest '(+ 1 2)))
3

user=> (class (first [+ 1 2]))
clojure.core$_PLUS_
user=> (apply (first [+ 1 2]) (rest '(+ 1 2)))
3