32

注:これは並行性に関するものではありません。これはスレッドマクロについてです。

->オブジェクトを2番目の位置に->>置き、引数を最後の位置に置くことを私は知っています。

さて、関数の短縮表記と同じように、引数を任意#( ... % )の場所に配置できるスレッドの短縮表記はありますか?

目標は、スレッドが通過する場所を固定する代わりに、任意のフォームを記述して、%%を特別な場所に挿入できるようにすることです。また、%%はスレッドが挿入される場所です。

ありがとう!

4

4 に答える 4

26

Swiss Arrowsライブラリの「ダイヤモンドの杖」は、あなたが求めていることを行います:

(-<> 0
 (* <> 5)
 (vector 1 2 <> 3 4))
; => [1 2 0 3 4]

そうは言っても、それはあなたが頻繁に必要とするものではありません(またはのClojureの経験では)

于 2012-04-09T03:13:33.633 に答える
15

他の誰かがこれに遭遇した場合、提供されたマクロが存在するのには理由がありますが、任意の配置のマクロは存在しません: 後者は貧弱な API 設計につながります。

->マクロは引数を最初の位置に配置します。conjこれは、 、などのサブジェクト引数で機能する関数に対応しますassoc

->>マクロは、引数を最後の位置に配置します。mapこれは、 、 などのシーケンスで機能する関数に対応しますreduce

API を適切に設計すれば、そのようなマクロが必要になる可能性は低くなります。

于 2012-04-09T06:18:31.847 に答える
2

この機能を提供するライブラリがありましたが、どこにあるのか忘れました。非推奨の 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 つのフォームで複数を使用できます。しかし、この実装では、同じフォームを複数回展開するという問題があります (単純化と引き換えに)。

于 2012-04-09T03:26:30.620 に答える