clojureでメタデータを試してみる

自分が見ていたアローマクロのソースでは、何故か内部でmeta関数を使っていました。ただ、その後別のバージョンのソースを見ると使っていなかったりして、よく分からない。
それはともかく、ついでにメタデータを少し試してみた。
メタデータは使い方次第でかなり協力な武器になりそうです。それは、メタデータは値だけではなく、関数も書けるから。

メタデータに単純な値をセットしてみる

user=> (def a (with-meta {:a 2} {:a 3}))
#'user/a
user=> a
{:a 2}
user=> (meta a) 
{:a 3}
user=> (:a (meta a))
3

メタデータに無名関数をセットしてみる

user=> (def a (with-meta {:a 2} {:a #(+ 1 2)}))
#'user/a
user=> a
{:a 2}
user=> (meta a)                                
{:a #<user$fn__276 user$fn__276@179d854>}
user=> ((:a (meta a)))                         
3

例えば、関数実行前後に処理したいことをメタデータに書いておき、実行するなんてことも出来そう。