clojureでアローマクロを試してみる

"->"をアローマクロと呼ぶのか分からないけど、他の呼び方が分からないので、とりあえずそう呼ぶ。

アローマクロを使ってマップに値を追加する方法

以下のように使用する。

user=> (-> {} (assoc :a 1))
{:a 1}
user=> (-> {} (assoc :a 1) (assoc :b 2))
{:b 2, :a 1}
user=> (-> {} (assoc :a 1) (assoc :b 2) (assoc :c 3))
{:c 3, :b 2, :a 1}

動きとしては以下と同じ。

user=> (assoc {} :a 1)
{:a 1}
user=> (assoc (assoc {} :a 1) :b 2)
{:b 2, :a 1}
user=> (assoc (assoc (assoc {} :a 1) :b 2) :c 3)
{:c 3, :b 2, :a 1}

参考:http://clojure.org/macros

アローマクロを使ってリストに値を追加する方法

マップだけじゃなく、リストにも使えます。意味あるか分かりませんが。

user=> (-> () (conj 1))         
(1)
user=> (-> () (conj 1) (conj 2))
(2 1)
user=> (-> () (conj 1) (conj 2) (conj 3))
(3 2 1)

アローマクロを使ってベクタに値を追加する方法

リストに出来てベクタに出来ないことは無いだろうと言うことで。

user=> (-> [] (conj 1))
[1]
user=> (-> [] (conj 1) (conj 2))
[1 2]
user=> (-> [] (conj 1) (conj 2) (conj 3))
[1 2 3]

リストとベクタで順番が逆なのは面白いです。
この辺りは後でもう少し調べてみようかな。