将变量列表单独传递给clojure函数

将变量列表单独传递给clojure函数,clojure,currying,destructuring,Clojure,Currying,Destructuring,我一直在玩clojure,并决定创建一个结合mapcat和list的高阶函数来模拟此行为: Clojure> (mapcat list '(1 2 3 4) '(5 6 7 8)) (1 5 2 6 3 7 4 8) 我的第一次尝试是定义mapcatList,如下所示: Clojure> (defn mapcatList[& more](mapcat list more)) #'sandbox99/mapcatList Clojure> (mapcatList '(1

我一直在玩clojure,并决定创建一个结合mapcat和list的高阶函数来模拟此行为:

Clojure> (mapcat list '(1 2 3 4) '(5 6 7 8))
(1 5 2 6 3 7 4 8)
我的第一次尝试是定义mapcatList,如下所示:

Clojure> (defn mapcatList[& more](mapcat list more))
#'sandbox99/mapcatList
Clojure> (mapcatList '(1 2 3 4) '(5 6 7 8))
((1 2 3 4) (5 6 7 8))
显然,函数的行为与我所希望的不一样,我认为这是因为两个列表被放在一个列表中,并作为单个参数传递,而不是两个。 我可以用以下方法补救这种情况:

Clojure> (defn mapcatList[x y & more](mapcat list x y))
#'sandbox99/mapcatList
Clojure> (mapcatList '(1 2 3 4) '(5 6 7 8))
(1 5 2 6 3 7 4 8)
此解决方案适用于两个列表,但我希望该函数适用于数量可变的参数


我的问题:如何将可变数量的参数传递给函数,然后对其进行分解,使其作为单个参数一起传递给“mapcat list”?

没错,由于vararg声明,这些参数被包装在一个列表中。您需要
应用
参数才能打开参数列表:

(defn mapcatList[& more]
  (apply mapcat list more))

user=> (mapcatList '(1 2 3 4) '(5 6 7 8))               
(1 5 2 6 3 7 4 8)
user=> (mapcatList '(1 2 3 4) '(5 6 7 8) '(\a \b \c \d))
(1 5 \a 2 6 \b 3 7 \c 4 8 \d)

您正在寻找
apply
。这将使用序列中提供的参数调用函数


但是,您是否知道有一个函数
interleave
,它正是您的
mapcatList
试图做的事情?

(defn mapcatList[&more](apply mapcat list more))是的,我知道。这一切都是在我自己尝试实现交错之后开始的。非常感谢。