kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

無名関数を作るためのシンタックスシュガー

普段Scalaのことばっかり書いてるこの日記だが、たまにはClojureの話題でも。Clojureには、無名関数を簡単に作るための構文があり、無名関数化したい範囲を#()で囲って、引数を与えたい部分に%を書くという感じで、短い無名関数を綺麗に書けるので気に入っている。たとえば、リストの全ての要素に1を足すという処理は、#()を使って以下のように記述できる。

user=> (map #(+ % 1) '(1 2 3 4 5))
(2 3 4 5 6)

無名関数の引数が複数ある場合も、もちろん対応していて、その場合は、第一引数は%1、第二引数は%2という具合に、%nという形で記述すれば良い。たとえば、リストの各要素を2乗した値を合計するという処理が以下のように書ける。このようなケースは、Scalaのプレースホルダ構文だとうまく書けない(同じ仮引数が複数個所に出現するため。複数引数の無名関数そのものはプレースホルダ構文でも扱える)ので、Clojureがちょっと羨ましい。

user=> (reduce #(+ %1 (* %2 %2)) '(1 2 3 4 5))
55