我从clojure函数中得到以下奇怪的行为:当我用一个参数调用它时,好像它是一个函数,当我在没有参数的情况下调用它时,它似乎是一个符号。有什么想法可以吗?
这是解释器中发生的事情:
=> (input-updatef -1)
ArityException传递给args(1)的数量错误:modelingutils / create-process-level / input-updatef - 2954 clojure.lang.AFn.throwArity(AFn.java:429)
当我尝试不加任何争论地调用它时:
=> (input-updatef)
ArityException传递给args(0)的数量错误:符号clojure.lang.AFn.throwArity(AFn.java:429)
THX!
答案 0 :(得分:3)
回答“这是怎么回事”:
user=> (defn foo [] ('foo))
#'user/foo
user=> (foo 1)
ArityException Wrong number of args (1) passed to: user/foo 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)
当然,您的input-updatef
情况可能更为微妙,但至少可以清楚
实际的input-updatef
函数没有一元重载,或者它有一个,但是当你调用它时,它最终会调用一个只有一个参数没有一元重载的函数;
它有一个无效的超载;
调用nullary重载会导致调用没有参数的符号。
此外,基于错误消息的modelingutils/create-process-level/input-updatef--2954
部分,我认为input-updatef
可能是“本地函数” - 使用letfn
创建或作为a的值引入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)
使用
(defn foo
([]
('foo))
([x]
(let [f (fn [])]
(f x))))
会有同样的效果。
答案 1 :(得分:0)
谢谢,这两个答案都有帮助。
我没有发布定义,因为它包含一个复杂的宏.. 问题是我从普通函数调用了宏,并从调用函数的参数列表中为该宏提供了一个参数(一个ff函数)。这个ff在宏观评估时被解释为一个符号 - 这就是导致奇怪行为的原因。
解决方案:我将外部调用函数更改为宏,并在被调用宏的参数列表中取消引用ff。