在JavaScript中,可以执行以下操作:
function foo(arg1, arg2, arg3) {
...
}
var others = [ 'two', 'three' ];
foo('one', ...others); // same as foo('one', 'two', 'three')
在Clojure中,可以像这样接受“变量args”:
(defn foo [arg1 & others]
...)
但是要将它们与其他args组合使用,您必须这样做:
(apply foo (concat '("one") others))
坦率地说,这真的很丑。当您需要重复执行操作时,这也是不可能的:
(apply recur (concat '("one") others)) ;; doesn't work
有更好的方法吗?如果没有,在recur
情况下有什么办法可以实现?
答案 0 :(得分:5)
但是要将它们与其他arg组合使用,您必须执行以下操作:
(apply foo (concat '("one") others))
您没有要做到这一点:apply
也是一个可变参数函数,可以在最终序列参数之前之前接受参数。
(apply foo "one" others)
您可以在最终序列参数之前将任意数量的单个参数传递给apply
。
user=> (defn foo [arg1 & args] (apply println arg1 args))
#'user/foo
user=> (apply foo "one" 2 "three" [4 "five" 6.0])
one 2 three 4 five 6.0
为进一步说明,对+
的这些调用在功能上是等效的:
(apply + 1 2 [3])
(apply + 1 [2 3])
(apply + [1 2 3])
当您需要重复执行操作时,这也是不可能的
recur
is a special form和apply
不能像典型的Clojure函数那样使用它。
在
recur
情况下,有什么办法可以实现?
不适用于apply
。您可以recur
使用可变参数,但不能(apply recur ...)
。