如何在函数调用中将显式args与变量args组合

时间:2019-04-22 02:36:00

标签: clojure

在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情况下有什么办法可以实现?

1 个答案:

答案 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 formapply不能像典型的Clojure函数那样使用它。

  

recur情况下,有什么办法可以实现?

不适用于apply。您可以recur使用可变参数,但不能(apply recur ...)