2012-06-15 40 views
4

爲什麼我得到2個不同的值Clojure的第一和休息

(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 

回答

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),你的本可以像書面一樣工作。

2

(第一'(+ 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