Массивы и коллекции / Итераторы

;; a lazy generator walking backwards: rseq hands
;; out a vector's elements from the end at once,
;; while reverse has to build a new collection
(defn rev-gen [data]
  (rseq (vec data)))

(doseq [c (rev-gen "string")]
  (println c))
;; printed g, n, i, r, t, s

(doseq [i (rev-gen [1 2 3])]
  (println i))
;; printed 3, 2, 1

;; range counts down lazily too
(println (vec (range 3 0 -1)))
;; [3 2 1]

;; and iterate makes an endless countdown
(println (take 5 (iterate dec 10)))
;; (10 9 8 7 6)