2015-04-20 2 views
2

Я хочу написать общую функцию, чтобы добавить векторов:Clojure: функция VARIADIC для сложения векторов

С картой я могу сделать следующее:

(vec (map + [1 2] [1 2] [1 2])) 
⇒ [3 6] 

(vec (map + [1 2 3] [1 2 3] [1 2 3])) 
⇒ [3 6 9] 

Я хотел бы быть в состоянии обернуть его в функцию, которая принимает любое число векторов. В настоящее время я версия, которая работает с использованием системы & повторялись:

(defn add-coords [& args] 
    (loop [coords (first args) more (rest args)] 
    (if (empty? more) 
     (vec coords) 
     (recur (map + coords (first more)) 
      (rest more))))) 

(add-coords [1 2] [1 2] [1 2]) 
⇒ [3 6] 

(add-coords [1 2 3] [1 2 3] [1 2 3]) 
⇒ [3 6 9] 

Есть ли способ сделать это в одной строке? Что-то вроде:

(defn add-coords [& args] (vec (map + args))) 

ответ

3

apply mapv должно помочь:

user=> (defn add-coords [& args] 
     (when (seq args) 
      (apply mapv + args))) 

в действии

user=> (add-coords [1 2 3] [1 2 3] [1 2 3]) 
[3 6 9] 
+0

Спасибо. Это красивый код. – user619882