Clojure 1.5では、新しいスレッド化マクロの1つを使用することもできます。
clojure.core /ままの>
([exprの&形態をNAME])
マクロ
バインド名exprに、その語彙文脈 で最初のフォームを評価バインドした後、その結果に名前をバインドし、最後に返されたフォームの結果を返します。
それはかなり新しい構造ですので、まだ慣用的に使用する方法がわからが、私はこのような何かをするだろうと思います。なぜ引数の位置については
(as-> "test test test" s
(str/split s #" ")
(modification-1 s)
(modification-2 s)
...
(modification-n s)
(str/join "\n" s))
編集
私はどこにも言えませんが、アーサーの示唆は意味をなさないと思います。
- 一部の機能は、コレクション(明らかに
map
、reduce
など)で動作します。これらは、一貫して、彼らはいくつかの機能がコレクションで動作し、最も重要な引数を取る傾向がない->>
- でうまく動作を意味し、最後の引数としてコレクションを取る傾向にある(ですその事?)最初として引数。たとえば、
/
を使用する場合、分子が最初に来ることが予想されます。これらの機能は、最もよく機能します
事はいくつかの機能があいまいです。彼らはコレクションをとり、単一の値を生成するか、単一の値をとりコレクションを生成することがあります。 string\split
は1つの例です(文字列が単一の値またはのコレクションの両方と考えることができるというさらなる混乱を無視してください)。連結/縮小操作もそれを行います - 彼らはあなたのパイプラインを台無しにするでしょう!
は、例えば、考えてみましょう:これらのケースでは
(->> (range 1 5)
(map inc)
(reduce +)
;; at this point we have a single value and might want to...
(- 4)
(/ 2))
;; but we're threading in the last position
;; and unless we're very careful, we'll misread this arithmetic
が、私はas->
のようなものは本当に便利だと思います。
私は、一般的にコレクションや->
上で動作している場合->>
を使用するためのガイドラインはそうでない音だと思う - そしてそれはこれらの境界線/あいまいな場合にだけだ、as->
はコード少し明確少しすっきり、作ることができます。
と間違っている何が? ( "\ n"(分割文字列 "\ s")を結合する) – Chiron
私はいくつかの修正関数を間に入れなかった。明確にするためにそれらを追加する。 – Profpatsch
なぜですか? 'clojure.string.join'はコレクションを取る他の関数と一貫しています。 '(map f col)(filter f col)' –