Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当无参数调用clojure函数时,其行为类似于符号_Clojure - Fatal编程技术网

当无参数调用clojure函数时,其行为类似于符号

当无参数调用clojure函数时,其行为类似于符号,clojure,Clojure,我从clojure函数中得到以下奇怪的行为:当我用一个参数调用它时,它似乎是一个函数;当我不使用参数调用它时,它似乎是一个符号。你知道这是怎么回事吗 这就是解释器中发生的情况: => (input-updatef -1) ArityException传递给以下对象的参数数目错误(1):modelingutils/create process level/input updatef--2954 clojure.lang.AFn.throwArity(AFn.java:429) 当我试着毫无

我从clojure函数中得到以下奇怪的行为:当我用一个参数调用它时,它似乎是一个函数;当我不使用参数调用它时,它似乎是一个符号。你知道这是怎么回事吗

这就是解释器中发生的情况:

=> (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))))