注:これは並行性に関するものではありません。これはスレッドマクロについてです。
->
オブジェクトを2番目の位置に->>
置き、引数を最後の位置に置くことを私は知っています。
さて、関数の短縮表記と同じように、引数を任意#( ... % )
の場所に配置できるスレッドの短縮表記はありますか?
目標は、スレッドが通過する場所を固定する代わりに、任意のフォームを記述して、%%を特別な場所に挿入できるようにすることです。また、%%はスレッドが挿入される場所です。
ありがとう!
Swiss Arrowsライブラリの「ダイヤモンドの杖」は、あなたが求めていることを行います:
(-<> 0
(* <> 5)
(vector 1 2 <> 3 4))
; => [1 2 0 3 4]
そうは言っても、それはあなたが頻繁に必要とするものではありません(または私のClojureの経験では)
他の誰かがこれに遭遇した場合、提供されたマクロが存在するのには理由がありますが、任意の配置のマクロは存在しません: 後者は貧弱な API 設計につながります。
->
マクロは引数を最初の位置に配置します。conj
これは、 、などのサブジェクト引数で機能する関数に対応しますassoc
。
->>
マクロは、引数を最後の位置に配置します。map
これは、 、 などのシーケンスで機能する関数に対応しますreduce
。
API を適切に設計すれば、そのようなマクロが必要になる可能性は低くなります。
この機能を提供するライブラリがありましたが、どこにあるのか忘れました。非推奨の clojure-contrib にあった可能性があります。-$>
マクロでした。
ただし、探しているものを作成するために、clojure のコア-> マクロから派生させることができます。
(defmacro -$>
([x] x)
([x form] (if (seq? form)
(with-meta (map #(if (= %1 '$) x %1) form) (meta form))
(list form x)))
([x form & more] `(-$> (-$> ~x ~form) ~@more)))
$ を使用して挿入ポイントを示します。
user=> (-$> 2 str (identity $) (println $))
2
nil
$
技術的には、1 つのフォームで複数を使用できます。しかし、この実装では、同じフォームを複数回展開するという問題があります (単純化と引き換えに)。