左から適用される合成関数
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)
こんな感じになりました。