; http://cap-lore.com/code/Scheme/Do.html (let* ( (Do (lambda (n p) (let Do ((n n)) (if (> n 0) (let ((u (- n 1))) (p u) (Do u)))))) (DoL (lambda (n p) (let l ((v '())(n (- n 1))) (if (< n 0) v (l (cons (p n) v)(- n 1)))))) (DoV (lambda (n p) (let ((v (make-vector n))) (Do n (lambda (j) (vector-set! v j (p j)))) v)))) (lambda (sy) (cdr (assq sy (list (cons 'Do Do) (cons 'DoL DoL)(cons 'DoV DoV)))))) ; Tests: ; (Do 4 (lambda (j) (write j))) ; => 3210 ; (DoV 5 (lambda (j) (+ j 3))) ; => #5(3 4 5 6 7) ; (DoL 7 (lambda (j) (* 10 j))) ; => (0 10 20 30 40 50 60)