[plt-scheme] Re: Newbie question: using a macro to create a top-level variable?
Thanks for the exceedingly clear explanation of what works and why.
Not only do I have a choice of solutions for my immediate situation,
but I also learned something you about define-syntax-rule: namely,
that there can be arbitrary syntax in the pattern as well as the
template. I never would have thought to put the apostrophe into the
pattern "(infoml:make-rack 'rack-id)". Thanks again for your help.
>
> The thing is that you want to quote one place only. An easy way to do
> this is:
>
> (define-syntax-rule (infoml:make-rack rack-id)
> (define rack-id (infoml:make-rack-manual 'rack-id)))
> (infoml:make-rack ideas) ; no quote
>
> You can do this with the quote:
>
> (define-syntax-rule (infoml:make-rack 'rack-id)
> (define rack-id (infoml:make-rack-manual 'rack-id)))
> (infoml:make-rack 'ideas)
>
> This looks like it's working, but what's really happening is that the
> scheme reader sees:
>
> (define-syntax-rule (infoml:make-rack (quote rack-id))
> (define rack-id (infoml:make-rack-manual (quote rack-id))))
>
> and `quote' is just a pattern variable that matches anything. So if
> you enter
>
> (infoml:make-rack (add1 ideas))
>
> it actually expands to
>
> (define ideas (infoml:make-rack-manual (add1 ideas)))
>
> To make this way work, you can use the more explicit `syntax-rules',
> and specify `quote' as a keyword:
>
> (define-syntax infoml:make-rack
> (syntax-rules (quote)
> [(_ (quote rack-id))
> (define rack-id (infoml:make-rack-manual (quote rack-id)))]))
>
> and doing this should make it clear that this is all redundant since
> the `quote' requirement is just an arbitrary piece of syntax that
> isn't really doing anything.
>
> --
> ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
> http://barzilay.org/ Maze is Life!
> _________________________________________________
> For list-related administrative tasks:
> http://list.cs.brown.edu/mailman/listinfo/plt-scheme