2011-12-15 2 views
3

Я играл вокруг с Clojure, и решил сделать функцию высшего порядка, который сочетает в себе mapcat и список эмулировать это поведение:Передача списка переменных индивидуально функции Clojure

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»?

+0

(defn картаcatList [& больше] (применять картаcat список более)) – vedang

ответ

13

Вы ищете apply. Это вызывает функцию с аргументами, указанными в последовательности.

Но знаете ли вы, что есть функция interleave, которая делает именно то, что пытается сделать ваш mapcatList?

+0

есть, я. Все это началось после того, как я попытался реализовать чередование. Спасибо. – wespiserA

5

Вы правы, аргументы завернуты в список в результате объявления vararg. Вы должны apply аргументы для того, чтобы развернуть список аргументов:

(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) 
Смежные вопросы