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