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

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Thu May 15 17:38:36 EDT 2014

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



Posted on the users mailing list.