with-gensymマクロ
テストのお供にどうぞ。
(define (make-gensym) (let1 i 0 (lambda () (set! i (+ i 1)) (string->symbol (format "G~d" i))))) (define-macro with-gensym (lambda body (let ([org (gensym)] [ret (gensym)]) `(let1 ,org gensym (set! gensym ,(make-gensym)) (let ((,ret (begin ,@body))) (set! gensym ,org) ,ret))))) (with-gensym (alpha-reduction '(lambda (x . y) (+ x (car y))))) => (lambda (G1 . G2) (+ G1 (car G2)))