🛻

ある条件を満たしていたら関数を適用するが、そうでない場合はそのまま返す

2023/11/09に公開

Clojure で、ある条件が true なら関数を適用して変換したいが、 false ならそのままの値を返してほしいとき。

素直に if で書くとこんな感じ

(if true (inc 1) 1)
;=> 2

; 関数にすると例えばこう
(defn if-fn [ok? fn coll]
  (if ok? (fn coll) coll))

(if-fn true inc 1)
;=> 2

これが cond->> を使うと少しすっきりする

cond->>cond 同様に本来は複数の条件を並べて、合致する場合に特定の処理を実行する、というもの。 cond->> はその際に、その特定の処理においてスレッディングラスト的な振る舞いをする。詳しくはドキュメントをどうぞ。

https://clojuredocs.org/clojure.core/cond->>

今回は条件は1つのみで、先に処理対象の値が来て、条件、そして合致した場合に適用する関数、となる。さっきの (if-fn true inc 1)1 が一番手前の引数の位置にくる。

(cond->> 1 true inc)
;=> 2

(defn cond->>fn [ok? fn coll]
  (cond->> coll ok? (fn)))

(cond->>fn true inc 1)
;=>2

if で書く場合は対象の値(ここでは 1 )を2回書かないといけないけど、 cond->> で書くほうは一度しか書かなくていいのでスレッディングマクロ内で使うときに使いやすい。

(-> [1 2 3]
    ((partial map inc))
    (cond->> some-condition (drop 1)))
;=> (3 4)

Discussion