Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:如何在函数调用之间保留可变参数_Clojure_Variadic Functions - Fatal编程技术网

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

Clojure:如何在函数调用之间保留可变参数,clojure,variadic-functions,Clojure,Variadic Functions,我有两个变量函数。其中一个将其论点传递给另一个。问题是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) 在实函数中,foo将其参数传递给变量java函

我有两个变量函数。其中一个将其论点传递给另一个。问题是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)
在实函数中,foo将其参数传递给变量java函数,因此varargs实际上需要保持varargs。我该怎么做?

来自

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

所以

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

您在这里问的问题与刚才问的其他问题有什么不同?是的,
apply
也是这里的答案。您需要
进入数组
以便进行Java方法调用(varargs是Java编译器的东西,Clojure不使用Java编译器,在jvm中它只使用数组作为最后一个arg),那么类似这样的事情呢
(应用标识ys)
我想按原样传递它们,所以我想这有点不同,我问的问题是转换它们,但保留它们为varargs,这是在一个函数中。我在
中尝试了
(应用标识ys)
,但我得到了
ArityException错误的args数(0)传递给:core/identity clojure.lang.AFn.throwArity(AFn.java:429)
java varargs是一个数组。他们就是这样。Java中的varargs不可能是非数组的。“保持它们为varargs”不是一个有任何意义的问题,因为它们首先只是一个数组(在Java编译器中有一点语法糖分,Clojure编译器不提供或尊重)。
(defn bar [x & ys] (apply foo (clojure.string/upper-case x) ys))