Clojure中匿名函数的Arity

ead*_*ead 3 clojure

我对Clojure很新,并且问自己,如何定义/扣除匿名函数的arity.

请考虑以下穷人count功能:

(reduce #(+ 1 %1) 0 '(1 2 3 55))
Run Code Online (Sandbox Code Playgroud)

使用clojure运行它我收到以下错误消息:

ArityException args(2)的错误数量传递给:user/eval1157/fn - 1158 clojure.lang.AFn.throwArity(AFn.java:429)

但是,它适用于JavaScript-Clojure并4根据需要返回(您可以在此处执行命令).

通过交换改变命令%1- > %2

(reduce #(+ 1 %2) 0 '(1 2 3 55))
Run Code Online (Sandbox Code Playgroud)

将在两个版本上编译(但不再起作用count).在这种情况下,似乎可以推断出%2至少有两个论点.

那么哪个版本的Clojure是对的?我是否允许向通过#(...)此函数内部定义的匿名函数提供任意数量的参数?

它应该被认为是JavaScript-Clojure中的错误吗?

编辑:正如在评论和答案中所解释的那样,这就是JavaScript的工作方式.有对Java的Clojure的,这是记录在案的差异在这里,特别是:

调用fn时,当前没有运行时强制执行arity

Syl*_*ter 6

结果函数中的参数由编号最高的已使用参数确定.因此,通过使用%2两者成为2 arity函数,但由于你只使用%1(或%)它在两个版本的Clojure中成为一个arity函数.

在JavaScript中,您可以传递任意数量的参数,甚至可以传递少于参数列表的参数.没有匹配参数的变量变为undefined没有定义参数的参数在函数中根本没有绑定和可用.ClojureScript必须在每个函数中添加参数检查,以获得与Clojure中相同的行为.如果这是指定的行为,那将是一个错误.许多转换语言都是这样做的.

您的示例的解决方案是不使用简短版本,而是fn:

(reduce (fn [a _] (+ 1 a)) 0 '(1 2 3 55))
Run Code Online (Sandbox Code Playgroud)