Кроме того, есть еще один «clojurish» способ сделать это:
(defn my-take [n data]
(when (and (pos? n) (seq data))
(lazy-seq
(cons (first data)
(my-take (dec n) (rest data))))))
этот ленивый, а также предотвращает переполнение стека. Более того, насколько я помню, clojure.core/take
реализован аналогичным образом