当无参数调用clojure函数时,其行为类似于符号
我从clojure函数中得到以下奇怪的行为:当我用一个参数调用它时,它似乎是一个函数;当我不使用参数调用它时,它似乎是一个符号。你知道这是怎么回事吗 这就是解释器中发生的情况:当无参数调用clojure函数时,其行为类似于符号,clojure,Clojure,我从clojure函数中得到以下奇怪的行为:当我用一个参数调用它时,它似乎是一个函数;当我不使用参数调用它时,它似乎是一个符号。你知道这是怎么回事吗 这就是解释器中发生的情况: => (input-updatef -1) ArityException传递给以下对象的参数数目错误(1):modelingutils/create process level/input updatef--2954 clojure.lang.AFn.throwArity(AFn.java:429) 当我试着毫无
=> (input-updatef -1)
ArityException传递给以下对象的参数数目错误(1):modelingutils/create process level/input updatef--2954 clojure.lang.AFn.throwArity(AFn.java:429)
当我试着毫无争议地称呼它时:
=> (input-updatef)
ArityException传递给的参数(0)数目错误:Symbol clojure.lang.AFn.throwArity(AFn.java:429)
谢谢 回答“这怎么可能”:
当然,您的input updatef
情况可能更微妙,但至少可以清楚地看到
input updatef
函数没有一元重载,或者它有一元重载,但是当您调用它时,它最终调用的函数没有一元重载,只有一个参数modelingutils/create process level/input updatef--2954
部分,我认为input updatef
可能是一个“本地函数”–使用letfn
创建,或作为let
绑定的值引入–在某个点从名为create process level
的函数返回。下面是一个可能的示例:
user=> (defn foo
([]
('foo))
([x]
(letfn [(f [])]
(f x))))
#'user/foo
user=> (foo 1)
ArityException Wrong number of args (1) passed to: user/foo/f--4 clojure.lang.AFn.throwArity (AFn.java:429)
user=> (foo)
ArityException Wrong number of args (0) passed to: Symbol clojure.lang.AFn.throwArity (AFn.java:429)
使用
会有同样的效果。谢谢,两个答案都有帮助 我没有发布定义,因为它包含一个复杂的宏。。 问题是,我从一个普通函数调用了宏,并从调用函数的参数列表向该宏提供了一个参数(ff函数)。这个ff在宏计算时被解释为一个符号——这就是导致这种奇怪行为的原因
解决方案:我将外部调用函数更改为一个宏,并在被调用宏的参数列表中不带引号的ff。input updatefcall
symbol
在任何地方都可以调用吗?您可以发布input updatef
的实现吗?如果您查看与该异常相关的堆栈跟踪,您将看到错误不在调用input updatef
的顶层调用中,而是在调用堆栈中更深的某个位置。如果没有有关input updatef实现的更多信息,则很难回答此问题。您需要提供函数的实际源代码。如果没有它,我们必须做出很多假设和猜测,这些假设和猜测可能会误导而不是帮助。
user=> (defn foo
([]
('foo))
([x]
(letfn [(f [])]
(f x))))
#'user/foo
user=> (foo 1)
ArityException Wrong number of args (1) passed to: user/foo/f--4 clojure.lang.AFn.throwArity (AFn.java:429)
user=> (foo)
ArityException Wrong number of args (0) passed to: Symbol clojure.lang.AFn.throwArity (AFn.java:429)
(defn foo
([]
('foo))
([x]
(let [f (fn [])]
(f x))))