To: alan@lcs.mit.edu Subject: scoping macros Reply-to: shivers@ai.mit.edu --text follows this line-- So, I'd like to write a macro that introduces a lexical contour. Here's my toy problem: (color) - macro form that produces the current lexical color. (with-green body ...) (with-blue body ...) Evaluate BODY forms in a lexical color contour that is green/blue, respectively. The default, top-level color is green. This doesn't work: --- (define-syntax color (syntax-rules () ((color) 'green))) (define-syntax with-blue (syntax-rules (color) ((with-blue body ...) (let-syntax ((color (syntax-rules () ((color) 'blue)))) body ...)))) (define-syntax with-green (syntax-rules (color) ((with-blue body ...) (let-syntax ((color (syntax-rules () ((color) 'green)))) body ...)))) --- Everything comes out green. Removing COLOR from the syntax-rules keyword list doesn't fix it. This *does* work: --- (define-syntax with-blue (syntax-rules (color) ((with-blue body ...) (let-syntax ((color (syntax-rules (color) ((color) 'blue)))) body ...)))) (with-blue (color)) 'green (define-syntax with-blue (lambda (exp r c) `(,(r 'let-syntax) ((color (,(r 'syntax-rules) () ((color) 'blue)))) . ,(cdr exp)))) > (with-blue (color)) 'blue > (list (color) (with-blue (color))) '(green blue) > (define-syntax with-green (lambda (exp r c) `(,(r 'let-syntax) ((color (,(r 'syntax-rules) () ((color) 'green)))) . ,(cdr exp)))) > (cons (color) (with-blue (list (color) (with-green (color))))) '(green blue green) ---