Clojure: How to Preserve Variadic Args Between Function Calls

[亡魂溺海] 提交于 2019-12-14 03:29:34

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!