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

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

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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20140515/8f11b015/attachment.html>

Posted on the users mailing list.