body) (let ((iter (gensym)) (list (gensym))) `(let ,iter ((,(car params) (car ,(cadr params))) (,list (cdr ,(cadr params)))) (when (not (null? ,(car params))) ,@body) (when (not (null? ,list)) (,iter (car ,list) (cdr ,list))))))

;; przykład użycia (for-list (i (list 10 20 30)) (display i) (newline))

Makra Higieniczne

Problem z makrami lispowymi jest taki, że rozwinięcie makra jest wstawiane w kod użytkownika. Nawet gdy używamy funkcji gensym do generowania symboli, w kodzie pozostają nazwy funkcji i form specjalnych (lub makr), które mogą być nadpisane przez użytkownika, co wcale nie musi być takie rzadkie. Użytkownik może użyć zmiennej, która wcześniej może być nazwą makra lub funkcji użytej w rozwinięciu.

Przykład:

(define-macro (unless test . body) `(if (not ,test) (begin ,@body)))

(let ((not (lambda (x) x))) (unless #t (display "x") (newline)))