無名関数で直にmapやvectorを返す時は #() ではなく fn を使う
user=> ((fn [x] [x x]) 1) [1 1] user=> ((fn [x] {:a x}) 1) {:a 1}
fn が ok なので #() でもいけそうだと思ったが
user=> (#([% %]) 1) java.lang.IllegalArgumentException: Wrong number of args passed to: LazilyPersistentVector (NO_SOURCE_FILE:0) user=> (#({:a %}) 1) java.lang.IllegalArgumentException: Wrong number of args passed to: PersistentArrayMap (NO_SOURCE_FILE:0)
exception に。
一貫性ないなあと思ったがそんなことはなかった。
user=> (macroexpand-1 '#([% %])) (fn* [p1__52] ([p1__52 p1__52])) user=> (macroexpand-1 '#({:a %})) (fn* [p1__56] ({:a p1__56}))
mapとvectorは()の先頭に位置しているので関数になるのだった。
(Clojureのmapやvectorはリストの先頭にあると自動的に関数として機能する)
この筋を通してmapやvectorを直に返そうとするなら #[% %] や #{:a %} の表記じゃないとだめだが、そんなリーダーマクロはないのでできない。