爲什麼我得到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
爲什麼我得到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
你麻煩的是,你要調用符號'+
而非功能+
。當你調用一個符號時,它會嘗試在第一個參數中查找符號(例如,如果它是{'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)
,你的本可以像書面一樣工作。
(第一'(+ 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