; loopy loops
(define (range . args)
(case (length args)
((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
((3) (let ((le? (if (negative? (caddr args)) >= <=)))
(let loop ((x(car args)) (xs '()))
(if (le? (cadr args) x)
(reverse xs)
(loop (+ x (caddr args)) (cons x xs))))))
(else (error 'range "unrecognized arguments"))))
(define (f n) (range 1 (+ n 1)))
(display (f 10)) (newline) (display "---") (newline)
(define (f n)
(for-each (lambda (x) (display x) (newline)) (range 1 (+ n 1))))
(f 10) (display "---") (newline)
(define (f n)
(and (< 1 n) (f (- n 1)))
(display n) (newline))
(f 10) (display "---") (newline)
(define (f n)
(let f ((n n) (i 1))
(display i) (newline)
(and (< 1 n) (f (- n 1) (+ i 1)))))
(display (f 10)) (newline) (display "---") (newline)
(define (f n)
(define (g i)
(display i) (newline)
(and (< i n) (g (+ i 1))))
(if (g 1) #f))
(f 10) (display "---") (newline)
(define (f n)
(define (g n i)
(let ((j (/ n)))
(display i) (newline)
(g (- n 1) (+ i 1))))
(g n 1))
(f 10)