Clojure:如何在函数调用之间保留可变参数

Dav*_*ams -2 clojure variadic-functions

我有两个可变参数函数。其中一个将其参数传递给另一个。问题是可变参数在第二次调用时变成了一个列表。我如何保持它们的可变参数?

=> (defn foo [x & ys] (println x ys))
=> (defn bar [x & ys] (foo (clojure.string/upper-case x) ys))
=> (foo "hi")  
hi nil
=> (bar "hi")
HI (nil)
Run Code Online (Sandbox Code Playgroud)

在实际函数中,foo 将其 args 传递给可变参数 java 函数,因此 varargs 确实需要保留 varargs。我该怎么做呢?

Sar*_*ien 5

来自http://clojuredocs.org/clojure_core/clojure.core/apply

;您也可以将操作数放在操作数列表之前,它们将在操作数列表中使用 (apply + 1 2 '(3 4)) ; 等于 (apply + '(1 2 3 4)) => 10

所以

(defn bar [x & ys] (apply foo (clojure.string/upper-case x) ys))
Run Code Online (Sandbox Code Playgroud)

应该管用。对于 Java varargs 的问题,请注意 noisesmith 的评论。