[racket] Strange macro behavior with set! and syntax-local-introduce

From: Spencer Florence (spencer at florence.io)
Date: Thu May 15 17:50:17 EDT 2014

That's not quite what I'm looking for. I want an arbitrary number of
identifiers that my macros can use, but that aren't actually visible to the
program at large.
With this solution a user of the language I'm writing could accidentally
reference g.


(note: I have an unrelated work around for my problem. But the initial
issue still makes no sense to me.)


On Thu, May 15, 2014 at 4:38 PM, Matthias Felleisen <matthias at ccs.neu.edu>wrote:

>
> Did you want this:
>
> #lang racket
>
> (require (for-syntax syntax/parse racket/syntax))
>
> (define-for-syntax funny #f)
>
> (define-syntax (make-funny-set! stx)
>   (syntax-parse stx
>     [(_ v) #`(define #,(begin (set! funny (format-id stx "g")) funny) v)]))
>
> (define-syntax (funny-ref stx)
>   (syntax-parse stx
>     [(_) funny]))
>
> (define-syntax (funny-set! stx)
>   (syntax-parse stx
>     [(_ v) #`(set! #,funny v)]))
>
> (make-funny-set! 2)
> (void (void (void (funny-set! 3))))
> (funny-ref)
>
> [I had to write such a macro a while back, and the above is roughly what I
> remember doing. Note the lexical context]
>
>
> On May 15, 2014, at 5:25 PM, Spencer Florence <spencer at florence.io> wrote:
>
> > I'm attempting to write a macro which introduces a new id, then another
> macro that set!s that id.
> > Example:
> >
> > #lang racket
> > (require (for-syntax syntax/parse racket/syntax))
> > (define-for-syntax funny #f)
> > (define-syntax (make-funny-set! stx)
> >   (syntax-parse stx
> >     [(_ v)
> >      (define unmarked (generate-temporary))
> >      (set! funny (syntax-local-introduce unmarked))
> >      #`(define #,unmarked v)]))
> > (define-syntax (funny-ref stx)
> >   (syntax-parse stx
> >     [(_)
> >      funny]))
> > (define-syntax (funny-set! stx)
> >   (syntax-parse stx
> >     [(_ v)
> >      #`(set! #,(syntax-local-introduce funny) v)]))
> >
> > (make-funny-set! 2)
> > (funny-set! 3)
> > (funny-ref)
> >
> > This program works as I expect, evaluating to 3. However if I change
> (funny-set! 3) to (void (funny-set! 3)) I get the error: "set!: unbound
> identifier in module in: g1"
> >
> > I do not get this error if I change (funny-ref) to (void (funny-ref)).
> >
> > If I look at the expansion of the (void (funny-set! 3)) program in
> drracket's macro stepper the the g1 in (define g1 2) and the g1 in (void
> (set! g1 3)) have the same color.
> >
> > To keep on with the strange, if I change the #,(syntax-local-introduce
> funny) inside of funny-set! to #,funny inside the behavior of all programs
> remains the same.
> >
> > Could someone explain whats going on?
> >
> > --Spencer
> > ____________________
> >  Racket Users list:
> >  http://lists.racket-lang.org/users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20140515/77233be5/attachment.html>

Posted on the users mailing list.