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