50

Clojureのマクロ->とマクロの違いは何ですか?->>

4

1 に答える 1

88

ドキュメント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)
于 2013-10-11T13:23:42.950 に答える