Clojure 算术例外,但所有的论点似乎都在那里

Clojure 算术例外,但所有的论点似乎都在那里,clojure,Clojure,下面是我的函数参数声明: (defn insert! [db mode {:keys [id paths name engage cost failpage redirect priority]}] ...fn body... 以及来自repl的测试调用: (insert! (:db system) :update {:id 1 :paths [] :name "blah" :engage 2 :cost 3 :failpage "hi" :redirect "meta"

下面是我的函数参数声明:

(defn insert!
 [db mode {:keys [id paths name engage cost failpage redirect priority]}]
 ...fn body...
以及来自repl的测试调用:

(insert! (:db system) :update {:id 1 :paths [] :name "blah" :engage 2 
       :cost 3 :failpage "hi" :redirect "meta" :priority 9})
此操作失败并出现错误: ArityException传递给的参数2的数目错误:活动$insert BANG-$fn

我想不出这一点;我的调用似乎与函数声明完全匹配。我真的遗漏了什么吗?

您的ArityException消息中$insert BANG-$fn1活动中的最后一个$fn表示它是在insert中创建的匿名函数!使用fn形式或接收错误数量参数的语法。一般来说,这样一个函数可以逃逸封闭函数,封闭函数可以返回它作为它的值,或者把它放在原子中的某个地方等等,但是这里错误的调用会在insert中的某个地方找到你需要检查一下它的身体

如果问题是插入!异常消息本身会提到活动$insert_BANG_

REPL中的一个示例:

user=> (defn foo [x] ((fn [x y] (+ x y)) x))
#'user/foo
user=> (foo 1 2)
ArityException Wrong number of args (2) passed to: user$foo  clojure.lang.AFn.throwArity (AFn.java:437)
user=> (foo 1)
ArityException Wrong number of args (1) passed to: user$foo$fn  clojure.lang.AFn.throwArity (AFn.java:437)
注意第一种情况下的用户$foo使用两个参数而不是一个参数调用foo,第二种情况下的用户$foo$fn使用foo中的一个参数调用fn[x y]+x y


1实际上,我希望读到_BANG.

您是否修改了此函数的参数,并且从此完成了:重新加载您的命名空间?可能正在获取旧版本,或者您可能意外地在错误的命名空间中定义了它$fn结尾处表示它位于匿名函数中。尝试将名称添加到每个匿名函数中,堆栈跟踪将更具可读性[args]。遗憾的是,这与语法不兼容。这就是为什么使用假名函数比较好的原因——因此stacktrace会更有用。fn fn做什么[args]。。。。