Clojure のマクロ->
とマクロの違いは何ですか?->>
ベストアンサー1
A. Webb がリンクしたドキュメントでは、「何」については説明されていますが、「なぜ」についてはよく説明されていません。
原則として、関数が単数主語に作用する場合、その主語は最初の引数になります (例: conj
、assoc
)。関数がシーケンス主語に作用する場合、その主語は最後の引数になります (例: 、map
) filter
。
したがって、->
と は->>
それぞれ最初の引数と最後の引数をスレッド化するものとして文書化されていますが、それぞれ単一の引数または連続した引数に適用するものと考えることも有用です。
たとえば、ベクトルを特異なオブジェクトとして考えることができます。
(-> [1 2 3]
(conj 4) ; (conj [1 2 3] 4)
(conj 5) ; (conj [1 2 3 4] 5)
(assoc 0 0)) ; (assoc [1 2 3 4 5] 0 0)
=> [0 2 3 4 5]
あるいは、シーケンスとして考えることもできます。
(->> [1 2 3]
(map inc) ; (map inc [1 2 3])
(map inc) ; (map inc (2 3 4))
(concat [0 2])) ; (concat [0 2] (3 4 5))
=> (0 2 3 4 5)