[racket] Strange macro behavior with set! and syntax-local-introduce
Then use gensym instead of g and "~a" instead.
On May 15, 2014, at 5: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
>
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users