左から適用される合成関数

F# の >> がClojureにも欲いですね。
Clojure では関数合成は comp を使いますが、comp で作った合成関数は、右から順に適用されます。
F#の

e >> f >> g >> h

が、Clojure では

(comp h g f e)

と書かなければなりません。でも、ソースコード読むときはなるべく左から右へ読みたいですよね。そこで簡単なものですが書いてみました。

関数版

(defn comp>> [& fs]
  (apply comp (reverse fs)))

マクロ版

(defmacro mcomp>> [& fs]
  (let [fsr# (reverse fs)]
    `(comp ~@fsr#)))

これでめでたく

(->> [1 2 3]
     (map (comp>> #(* % %), inc, (partial * 10))))
;;=> (20 50 100)

(->> [1 2 3]
     (map (mcomp>> #(* % %), inc, (partial * 10))))
;;=> (20 50 100)

こんな感じになりました。