Мы можем сделать ответ Михаила Марчика точнее, используя соглашение - которому следуют многие основные функции - что вы получаете значение по умолчанию или значение идентичности, вызывая функцию без аргументов. Например:
(+) ;=> 0
(concat) ;=> ()
Код становится
(defn map-ext [f & seqs]
(lazy-seq
(when (some seq seqs)
(cons (apply f (map #(if (seq %) (first %) (f)) seqs))
(apply map-ext f (map rest seqs)))
)))
(map-ext + [1 2 3] [4 5 6 7 8] [3 4])
;(8 11 9 7 8)
Я внес минимальные изменения. Это может быть немного ускорено.
Нам может понадобиться функция, которая вставит такое значение по умолчанию в функцию, в которой его нет:
(defn with-default [f default]
(fn
([] default)
([& args] (apply f args))))
((with-default + 6)) ;=> 6
((with-default + 6) 7 8) ;=> 15
Это можно ускорить или даже превратить в макрос.