为什么匿名函数不能与 clojure 中的地图一起使用?

zen*_*god 3 maps clojure

当我执行以下操作时,它会起作用:

user> (#(+ % 8) 7)
15
Run Code Online (Sandbox Code Playgroud)

但为什么这不起作用?

user> (#({:a %}) 7)
Execution error (ArityException) at user/eval74597$fn (form-init937950372947324749.clj:760).
Wrong number of args (0) passed to: clojure.lang.PersistentArrayMap
Run Code Online (Sandbox Code Playgroud)

预期结果:{:a 7}

cfr*_*ick 7

Anon-fn#()是一个阅读器宏。如果查看生成的代码,就很明显了,为什么它不起作用(主体被调用):

user=> '#({:a %})
(fn* [p1__8266#] ({:a p1__8266#}))
Run Code Online (Sandbox Code Playgroud)

所以 arg 被作为一张地图的键传递,它被立即调用,因为这是 reader 宏所做的。通常安全的方法是使用do, 当您想使用数据文字时:

user=> (#(do {:a %}) 7)
{:a 7}
Run Code Online (Sandbox Code Playgroud)

或者,当然,使用各种函数hash-map来创建数据结构。