(define-syntax color (syntax-rules () ((color) 'green))) (define-syntax with-blue (lambda (exp r c) `(,(r 'let-syntax) ((color (,(r 'syntax-rules) () ((color) 'blue)))) . ,(cdr exp)))) (with-blue (color)) ;;; This has a problem -- WITH-BLUE is not hygenic: (let ((color (lambda () 'foo))) (with-blue (color))) => blue ;;; Let's fix this by adding a layer of indirection -- ;;; 1. (color) ==> (hidden-color) ;;; 2. with-blue frobs the definition of *our* hidden-color (define-syntax hidden-color (lambda (exp r c) `(,(r 'quote) green))) (define-syntax color (lambda (exp r c) `(,(r 'hidden-color)))) (define-syntax with-blue (lambda (exp r c) `(,(r 'let-syntax) ((,(r 'hidden-color) (,(r 'syntax-rules) () ((,(r 'hidden-color)) (,(r 'quote) blue))))) . ,(cdr exp)))) ;;; Without all the renaming, the above is ;;; (let-syntax ((hidden-color (syntax-rules () ((hidden-color 'blue))))) ;;; body ...) ;;; where *all* symbols on the first line are renamed, *including* ;;; hidden-color, so we should be redefining the same hidden-color ;;; to which (color) expands. ;;; It doesn't work: (with-blue (color)) => green