在没有参数的情况下调用时,clojure函数的行为就像一个符号

时间:2015-02-18 17:09:38

标签: clojure

我从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!

2 个答案:

答案 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情况可能更为微妙,但至少可以清楚

  1. 实际的input-updatef函数没有一元重载,或者它有一个,但是当你调用它时,它最终会调用一个只有一个参数没有一元重载的函数;

    < / LI>
  2. 它有一个无效的超载;

  3. 调用nullary重载会导致调用没有参数的符号。

  4. 此外,基于错误消息的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。