In the old macro expansion model marks are applied to input / output when
submac is applied. Since FOO-ID is retrieved from a property it has no
"input mark". We can use syntax-local-introduce to mark it ourselves.
#lang racket
(define foo 'module-foo)
(define-syntax (mac stx)
(syntax-case stx ()
[(_ SUBMAC)
(with-syntax ([SUBMAC (syntax-property #'SUBMAC 'foo-id #'foo)])
#`(begin (displayln (format "module foo = ~a" #,(syntax-property
#'SUBMAC 'foo-id)))
SUBMAC))]))
(define-syntax (submac stx)
(syntax-case stx ()
[(_)
(with-syntax ([FOO-ID (syntax-local-introduce (syntax-property stx
'foo-id))])
#`(begin
(define FOO-ID 'submac-foo)
(displayln (format "submac foo = ~a" FOO-ID))))]))
(mac (submac)) ; why not an "identifier already defined" error?
2018-05-21 22:28 GMT+02:00 Matthew Butterick <[email protected]>:
> I must be missing something obvious. But I've developed short-term macro
> blindness.
>
> The idea is that the `foo` identifier is packaged into the call to
> `submac` as a syntax property.
>
> When I retrieve this property from inside `mac`, it returns the expected
> 'module-foo value.
>
> But when I retrieve this property from inside `submac`, it creates a new
> nonconflicting variable. This confuses me: what I expect is that `submac`
> should try to bind the same identifier, producing an error.
>
>
> ;;;;;;;;;;;;
>
> #lang racket
>
> (define foo 'module-foo)
>
> (define-syntax (mac stx)
> (syntax-case stx ()
> [(_ SUBMAC)
> (with-syntax ([SUBMAC (syntax-property #'SUBMAC 'foo-id #'foo)])
> #`(begin (displayln (format "module foo = ~a" #,(syntax-property
> #'SUBMAC 'foo-id)))
> SUBMAC))]))
>
> (define-syntax (submac stx)
> (syntax-case stx ()
> [(_)
> (with-syntax ([FOO-ID (syntax-property stx 'foo-id)])
> #`(begin
> (define FOO-ID 'submac-foo)
> (displayln (format "submac foo = ~a" FOO-ID))))]))
>
> (mac (submac)) ; why not an "identifier already defined" error?
>
> --
> You received this message because you are subscribed to the Google Groups
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
--
--
Jens Axel Søgaard
--
You received this message because you are subscribed to the Google Groups
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.