Clojureのcompが使いづらい
使いづらいは言い過ぎですが、comp
で部分適用した関数を合成したいとき、
(def f (comp
(partial + 2)
(partial * 2)))
(f 2)
;=> 6
とかやらないといけないですよね。comp
でpartial
した関数を合成したいケースって結構あると思うんですが、毎回partial
書くのだるい。とくにhaskellとか書いた後によく感じます。
ので、こういうcomp>
内に含まれるやつは部分適用扱いにするマクロ書いて普段使ったりしてるんです。スレッディングマクロの関数合成版みたいな。
(defmacro comp> [& coll]
(let [fns (for [f coll]
(if (and (seq? f)
(not= (first f) 'fn)
(not= (first f) 'fn*))
`(partial ~@f)
f))]
(cons `comp fns)))
これを使うと
(def f (comp> (+ 2) (* 2)))
(f 2)
;=> 6
簡単に書けます。
これも関数を返す関数は使えないとか問題があるんですが、なんかもっといい解決方法ないですかね