(def range (start end (o step (if (< start end) 1 -1))) (if (or (and (> step 0) (~> start end)) (and (< step 0) (~< start end))) (cons start (range (+ start step) end step)))) arc> (range 0 2) (0 1 2) arc> (range 2 0) (2 1 0) arc> (range 0 -2) (0 -1 -2) arc> (range 0 -9 -2) (0 -2 -4 -6 -8)
(def unfold (f init) (aif (f init) (cons (car it) (unfold f (cdr it))) nil)) (def range-up (start end (o step 1)) (unfold [if (<= _ end) (cons _ (+ _ step))] start)) (def range-down (start end (o step 1)) (unfold [if (>= _ end) (cons _ (- _ step))] start)) (def range (start end (o step 1)) ((if (< start end) range-up range-down) start end step))
arc> (range 1 100 10) (1 11 21 31 41 51 61 71 81 91) arc> (range 1 -100 10) (1 -9 -19 -29 -39 -49 -59 -69 -79 -89 -99)
-----