(def foo ->) は失敗します.
Clojure で内部 DSL を作っているときなど clojure.core のマクロに別名をつけたい場合があります.そんなときに def を使って,(def foo ->) とすると,
user=> (def foo ->)
CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/->, compiling:(NO_SOURCE_PATH:1)
失敗します.-> ではなく var の #'-> であればバインドはできます.
user=> (def foo #'->)
# 'user/foo
しかし,この foo はマクロとしては機能しません.
user=> (foo {:a 10} (assoc :b 20))
ArityException Wrong number of args (2) passed to: core$assoc clojure.lang.AFn.throwArity (AFn.java:437)
ではどのようにすればよいのかというと:
user=> (def ^:macro foo #'->)
# 'user/foo
user=> (foo {:a 10} (assoc :b 20))
{:b 20, :a 10}
のように,メタデータで :macro を true にしてあげればよいのでした.
このノウハウの出典