4

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

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

(apply + '(1 2))
> 3

什么时候

(first '(+ 1 2)) 
> +

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

我尝试减少并得到相同的值

(reduce (first '(+ 1 2)) (rest '(+ 1 2)))
> 2
4

2 回答 2

8

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

'(+ 1 2)顺便说一句,这是使用和创建列表的区别(list + 1 2)。前者创建符号 +、1 和 2 的列表。因为 '1 和 1 相同,所以没关系。但是符号'+不是Var clojure.core/+,所以后者获取Var的值而前者只是获取符号。因此,如果您完成了(list + 1 2),您的本可以按照书面方式工作。

于 2012-06-15T17:23:41.377 回答
2

(first '(+ 1 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
于 2012-06-15T17:16:42.677 回答