(define do (macro (vars test . cmds) (define (_step v) (if (null? v) '() (if (null? (cddr (car v))) (_step (cdr v)) (cons `(set! ,(caar v) ,(caddr (car v))) (_step (cdr v)) ) ) ) ) `(let ,(map (lambda (v) (list (car v) (cadr v))) vars) (while (not ,(car test)) ,@cmds ,@(_step vars) ) ,@(cdr test) ) ) ) (do ((x 1 (+ x 1))) ((= x 10) "done") (display "x: ") (write x) (newline) ) (do ((vec (make-vector 5)) (i 0 (+ i 1))) ((= i 5) vec) (vector-set! vec i i))