[racket] syntax-parse #:at
On 05/21/2012 10:06 AM, Jon Rafkind wrote:
> On 05/21/2012 06:02 AM, Matthew Flatt wrote:
>> At Sun, 20 May 2012 22:42:30 -0600, Jon Rafkind wrote:
>>> The issue is why do I have to use a name other than 'name' for the
>>> pattern variable on the line where it says 'HERE'. If I use the
>>> 'name' pattern variable then the syntax-parse form generated by
>>> 'make-transformer' will use the wrong lexical context for the literal
>>> set. I don't see how the lexical context of the outer 'name' differs
>>> from the inner 'new-name', other than the 'new-name' has an extra
>>> mark on it.
>> When you use `name' instead of `new-name', then `name' gets replaced by
>> `x' from the use of `define-new-syntax', and `x' (unlike `name') has a
>> different lexical context than `new-name'.
>>
>
> I thought that too but while debugging it didn't seem to be the case. If I put a printf in the 'make-transformer' macro to "see" what name is being passed in then using 'name' or 'new-name' as the pattern variable results in the same thing being printed.
>
> (begin-for-syntax
> (define-syntax (make-transformer stx)
> (syntax-parse stx
> [(_ name pattern template)
> (printf "Name is ~a\n" #'name)
> #'#'(lambda (stx)
> (syntax-parse stx
> #:literal-sets ([literals #:at name])
> [pattern template]))])))
>
>
> Then calling 'make-transformer' 3 different ways:
>
> (lambda (stx)
> (syntax-parse stx
> [(_ new-name)
> (with-syntax ([output (make-transformer name pattern template)])
> #'(define-syntax new-name output))]
>
> "Name is #<syntax:x.rkt:56:19 x>", where line 56 is the use-site of 'define-new-syntax'
>
> (lambda (stx)
> (syntax-parse stx
> [(_ name)
> (with-syntax ([output (make-transformer name pattern template)])
> #'(define-syntax name output))]
> "Name is #<syntax:x.rkt:56:19 x>"
I guess this case doesn't print #<syntax:x.rkt:39 x> because the 'name' at the use-site of 'make-transformer' is not bound by the pattern variable 'name'. If that is the case then it seems this case should be identical to the 1st case where it uses a different pattern variable, 'new-name'.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120521/9033642e/attachment.html>