[racket] syntax-parse #:at

From: Jon Rafkind (rafkind at cs.utah.edu)
Date: Mon May 21 12:06:59 EDT 2012

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.

    (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>"

(lambda (stx)
  (syntax-parse stx
   [(_ new-name)
    (with-syntax ([output (make-transformer new-name pattern template)]) ;; line 39
      #'(define-syntax new-name output))]

"Name is #<syntax:x.rkt:39:61 new-name>"

It seems like the 2nd and 3rd cases should be similar in that the 2nd case should report #<syntax:x.rkt:39:61: x> as the source instead of the original x from the use-site. So given that there is a difference between the 1st and 2nd cases how can I "see" this? printf doesn't seem to be the right tool.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120521/cd3dfadb/attachment.html>

Posted on the users mailing list.