;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; do.scm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (do-demo) (do ((i 1 (+ i 1))) ; local, init, inc ((> i 10) i) ; terminating condition and return value (print i)) (do ((l '(a b c d e f g) (cdr l))) ((null? l) 'fini) (print l))) ;;; ;;; NOTE ;;; can you define while as a recursive function? ;;; for ? ;;; (define (fact n) (cond ((= 0 n) 1) (t (let ((prod 1)) (do ((i 1 (+ i 1))) ((> i n) prod) (set! prod (* prod i))))))) ;;; ;;; Iterative factorial ;;; (define (fact2 n) (cond ((= n 0) 1) (#t (do ((i 1 (+ i 1)) (prod 1 (* prod i))) ((> i n) prod))))) ;;; ;;; An alternative way of doing it ;;; (define (feo l f) ; for each element of a list, do something (do ((ls l (cdr ls))) ((null? ls)) (let ((e (car ls))) (display (f e)) (display " ")))) ;;; ;;; (feo '(1 2 3) odd?) ;;; (define (for-i from by to f) (do ((i from (+ i by))) ((> i to)) (display (f i)) (display " "))) ;;; ;;; (for-i 10 2 20 (lambda (x) (* x x))) ;;; (define (until p state f) (do ((s state (f s))) ((p s) s))) ;;; ;;; equivalent of ;;; loop until (p state) do (set! state (f state)) ;;; and deliver state as a result ;;; ;;; (until (lambda (x) (> x 100)) ;;; 2 ;;; (lambda (x) ;;; (display x) (display " ") ;;; (* x x))) ;;; ;;; will print out 2 4 16 ;;; (define (case-demo n) (case n ((0) 'a) ((1 3 5 7) 'odd) ((2 4 6 8) 'even) (else 'dontno))) ;;; ;;; the case statement ;;;