Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
301 views
Welcome To Ask or Share your Answers For Others

1 Answer

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...