What is it, naokirin?

Clojureの"->"(arrow)マクロ

いろいろClojureを調べていたところ出くわした"->"というマクロが気になったのでリファレンスを見てなんとなく理解した気がするので書いておきます。

アロー(->)なマクロさん

現代的にしようという意図はありつつも、Lisp道をひた走るClojureさん。
連鎖的な関数呼び出しでよくあるのはやはりS式です。

(println (- (int 2.1) 1))
; => 1

この結果は1が表示されるというものです。

ですが、"->"マクロは同じことを

(-> 2.1 int (- 1) println)
; => 1

このような書き方で実現できるようになります。
つまり、最初に受け取った引数を第2引数で受け取った関数の第1引数に、そしてその結果を第3引数で受け取った関数の第1引数に…といった形で処理していきます。S式の例と見比べれば分かりやすいと思います。

ダブルアロー(->>)なマクロさん

ダブルアローとか適当につけていますが、実際の名前は多分違います。そもそも正確な名前が付いているのかも知りませんが。


第1引数に渡していくのが"->"なら、最後の引数に渡していくのが"->>"です。

さっそくですが"->>"を使ってみます。

(->> 2.1 int (- 1) println)
; => -1

先ほどの"->"と全く同じように引数を渡しています。
ですが、今回は(- 1 2)と引き算部分が処理されるために結果は-1が出ます。

これらのマクロを使えば、括弧が多くなって煩雑になりがちなS式よりもすっきりと書くことができる場面もあるかもしれませんね。