我有一张 map,我想编写一个自定义函数来更新它。
(-> {:a 1 :b 2}
(fn [x] (update x :a inc)))
这当然是一个简单的示例,无需将函数包装在即可轻松完成update
,但是它显示了我想要执行的操作。但这给了我以下错误。
Syntax error macroexpanding clojure.core/fn at (core.clj:108:1).
{:a 1, :b 2} - failed: vector? at: [:fn-tail :arity-1 :params] spec: :clojure.core.specs.alpha/param-list
{:a 1, :b 2} - failed: (or (nil? %) (sequential? %)) at: [:fn-tail :arity-n] spec: :clojure.core.specs.alpha/params+body
我不明白为什么这不起作用,因为线程宏应该将我的 map作为函数中的第一个参数,对吗?
您可以随时macroexpand
查看发生了什么。就您而言,macroexpand将为您返回:
(fn {:a 1, :b 2} [x] (update x :a inc))
显然,这不是有效的功能。但是,如果您这样调整:
(-> {:a 1 :b 2}
(#(update % :a inc)))
扩展后的表格将变为有效:
(#(update % :a inc) {:a 1, :b 2})