4

なぜ2つの異なる値を取得するのですか?

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

(apply + '(1 2))
> 3

いつ

(first '(+ 1 2)) 
> +

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

reduce を試してみましたが、同じ値が得られました

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

2 に答える 2

8

'+問題は、 function ではなくシンボルを呼び出そうとしていることです+。シンボルを呼び出すと、最初の引数でシンボルを検索しようとします (たとえば、そうであった{'a 1 '+ 5 'b 2}場合は を取得したことになります5)。nil2 番目の引数を渡すと、最初の引数でシンボルが見つからない場合の代わりに、その値が返されます。したがって、 を呼び出すと('+ 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

(最初の '(+ 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 に答える