问题
I have two variadic functions. One of them passes its arguments to the other. The problem is that the varargs are becoming a list on the second call. How do I keep them varargs?
=> (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)
In the real function, foo passes its args to a variadic java function, so the varargs really need to stay varargs. How do I do this?
回答1:
From http://clojuredocs.org/clojure_core/clojure.core/apply
;you can also put operands before the list of operands and they'll be consumed in the list of operands (apply + 1 2 '(3 4)) ; equal to (apply + '(1 2 3 4)) => 10
So
(defn bar [x & ys] (apply foo (clojure.string/upper-case x) ys))
should work. For your problem with Java varargs note noisesmith's comment.
来源:https://stackoverflow.com/questions/26061503/clojure-how-to-preserve-variadic-args-between-function-calls