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)))