Clojureでメソッドチェイン風に記述するマクロ

In: Clojure

26 12月 2009

Clojureの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 (文字のシーケンス)) という処理をしたいので ->> を 使うことになります。

blog comments powered by Disqus
Get Adobe Flash playerPlugin by wpburn.com wordpress themes

About this blog

私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。

Photostream

    Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Tips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMate