Hi all,

I'm writing a macro which needs to break hygiene to introduce a function 
definition. Here is my current hygienic -- and useless -- version:

(define-syntax (named-query stx)
  (syntax-case stx (name-line)
    [(_ (name-line (_ 0) (_ "name") magic-name))
     (with-syntax ([name (string->symbol (syntax->datum #'magic-name))])
       #'(define name
           (lambda () (void))))]
    [(_ (name-line (_ 0) (_ "name") magic-name) . rst)
     (with-syntax ([name (string->symbol (syntax->datum #'magic-name))]
                   [modified-rst (cons (datum->syntax #'rst 
always-true-line) #'rst)])
       #'(define name
           (lambda () (query . modified-rst))))]))

The macro invocation will look something like this:

(named-query
   (name-line (offset 0) (name-type "name") "tga-image"))

I know I need to use datum->syntax to create an unhygienic function 
identifier. But I'm getting hung up on the pattern variable 'magic-name'. 
How the heck can I use it do this? First, I convert it from a string to a 
symbol but then what? I've made various attempts but I can't figure out a 
way to use it inside the template and do what I need to with it. My 
attempts to use with-syntax* also fail with errors like "modified-rst: 
unbound identifier in module (in phase 1, transformer environment)".

I think my general problem is that I don't understand when and how I can 
use pattern variables. In this case I think I need to create a datum from 
the pattern variable so I can run datum->syntax on it. But I haven't been 
able to figure out how to do that in a template. For instance, this also 
fails to create an identifier I can use outside of the macro:

(with-syntax ([name (datum->syntax #'magic-name (string->symbol 
(syntax->datum #'magic-name)))])

I really appreciate any help.

-- Jonathan

-- 
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 racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/9dfef638-35c6-4d1b-b9bb-2e6670e15140%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to