当我执行以下操作时,它会起作用:
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}
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
来创建数据结构。
归档时间: |
|
查看次数: |
164 次 |
最近记录: |