我对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
结果函数中的参数由编号最高的已使用参数确定.因此,通过使用%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)
| 归档时间: |
|
| 查看次数: |
433 次 |
| 最近记录: |