無名関数で直に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 %} の表記じゃないとだめだが、そんなリーダーマクロはないのでできない。