[plt-scheme] Non-hygenic Macro Revelation
At Thu, 25 Mar 2010 12:41:58 -0600, Jay McCarthy wrote:
> I've always used the pattern
>
> (datum->syntax stx (string->symbol (format "~a?" (syntax->datum #'id))))
> when defining, for example, predicates of inputs to macros. (stx is
> the syntax object given to the transformer.)
>
> [...]
>
> In this example x? is unbound, because it gets the lexical context of
> the define-pred-wrap macro, not the user's program. This can be easily
> fixed by using
>
> (datum->syntax #'id (string->symbol (format "~a?" (syntax->datum #'id))))
>
> [...]
>
> Is there a convention I don't know about?
I don't think I've ever seen a case where the former is preferable. The
latter has always seems like the right choice in the macros that I've
written. (So, I agree with Carl's ordering of the options.)
> One
> idea is to use stx when the new identifier is based on multiple
> inputs, but otherwise use the context of the base identifier.
Multiple contexts show up with `define-struct', for example, where a
selector name is formed from the type name plus a field name. In that
case it's less clear, but using one of the identifiers still seems
best. In the case of `define-struct' selectors and mutators, the type
name's context is used. (That's not documented, currently, but I'll fix
the docs.)