いわゆる卍研究所。
In: Clojure
26 12月 2009ClojureのAPIリストを眺めていたら面白いマクロがありました。 -> と ->> です。
Rubyのメソッドチェインのようなことができます。
例えば次のようなRubyでの処理は
123456789.to_s.length => 9
ClojureでもJavaのメソッドを直接使う場合は .. でチェインできます。
user> (.. 123456789 toString length) => 9
-> を使えばこれをClojure上の関数で実現できます。
user> (-> 123456789 str count) => 9
123を文字化して逆順にする場合
user> (-> 123 str reverse) => (\3 \2 \1)
reverseは文字のシーケンスを返すので
user> (->> 123 str reverse (apply str)) => "321"
のようにします。今回は -> ではなく ->> をつかいました。
この -> と ->> の違いはなんでしょう。
簡単な例で検証してみます。
例)2に3を足してから4倍する
user> (-> 2 (+ 3) (* 4)) => 20 user> (->> 2 (+ 3) (* 4)) => 20
この例では同じ結果ですね。
次の場合はどうでしょう。
user> (-> 8 (* 6) (/ 2 3)) => 8 user> (->> 8 (* 6) (/ 2 3)) => 1/72
ここで違いがでました。
それぞれのマクロを展開してみます。
(-> 8 (* 6) (/ 2 3))) → (/ (* 8 6) 2 3) (->> 8 (* 6) (/ 2 3))) → (/ 2 3 (* 6 8))
引数を複数とる関数を対して関数名の次に展開するのが ->
末尾に展開するが ->> という違いでした。
先の例では (apply str (文字のシーケンス)) という処理をしたいので ->> を 使うことになります。
私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。