scsh-0.5/scsh/rx/alanltr

71 lines
1.6 KiB
Plaintext

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