温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Clojure custom function for threading macro
clojure macros

其他 - Clojure自定义函数用于线程宏

发布于 2020-04-12 12:18:01

我有一张 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作为函数中的第一个参数,对吗?

查看更多

提问者
Codey
被浏览
60
rmcv 2020-02-02 23:19

您可以随时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})