71 lines
1.6 KiB
Plaintext
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)
|
|
---
|
|
|