map does not do this itself, but you can use a combination of concat and repeat to get the desired result:
(def x [1 2 3 4]) (def y [1 2 3 4 5]) (def z [1 2 3 4 5 6 7]) (map + (concat x (repeat 0)) (concat y (repeat 0)) z) ; => (3 6 9 12 10 6 7)
Here's the API documentation for concat , and for repeat .
And here is a sketch of how you can get a little distracted from this, so you do not need to know which of the collections is the longest. (In the above snippet, if you concat all collections to (repeat 0) , you will have an infinite sequence).
(defn map-longest [f default & colls] (lazy-seq (when (some seq colls) (cons (apply f (map #(if (seq %) (first %) default) colls)) (apply map-longest f default (map rest colls)))))) (map-longest + 0 [1 2 3 4] [1 2 3 4 5] [1 2 3 4 5 6 7]) ; => (3 6 9 12 10 6 7)
You can see a couple of other approaches as answers to this previous stack overflow question .
jbm
source share