[racket] Macro and define question

From: Stephen Chang (stchang at ccs.neu.edu)
Date: Tue Sep 3 00:32:26 EDT 2013

If you change datum->syntax's first argument to #'argument, then it
does what you want.

In general if you want the identifiers created by datum->syntax to be
visible to the user, you need to supply a piece of syntax that you got
from the user. That's why calling "long" directly works but not if
it's called via "short".



On Mon, Sep 2, 2013 at 8:08 PM, Tim Jervis <tim at timjervis.com> wrote:
> Hello,
>
> I have been trying to create a macro to make some arbitrary definitions,
> with success. The following defines a structure (posn) and a value (val):
>
> (define-syntax (long syntax-object)
>   (syntax-case syntax-object ()
>     [(_ argument)
>      (let ([make-id (lambda (x) (datum->syntax syntax-object x))])
>        (with-syntax ([posn (make-id 'posn)]
>                      [val-s (make-id 'val)])
>          #'(begin (printf "\tfrom the \"long\" macro, defining a structure
> and a value\n")
>                   (struct posn (x y))
>                   (define val-s 12))))]))
>
>
> So:
>
> (long argument)
>
>
> defines posn and val.
>
> However, if I happen to use this macro indirectly, the definitions aren't
> visible. For example, if I define:
>
> (define-syntax (short syntax-object)
>   (syntax-case syntax-object ()
>     [(_ argument)
>      #'(long argument)]))
>
>
> and then call
>
> (short argument)
>
>
> posn and val are not defined, even though the text in the printf buried in
> the first macro does appear.
>
> I tried this in Dr Racket.
>
> Can anyone tell me where I'm going wrong?
>
> Kind regards,
>
>
>
> Tim
>
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users
>

Posted on the users mailing list.