<div dir="ltr">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.<br>With this solution a user of the language I'm writing could accidentally reference g.<br>
<br><br>(note: I have an unrelated work around for my problem. But the initial issue still makes no sense to me.)<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, May 15, 2014 at 4:38 PM, Matthias Felleisen <span dir="ltr"><<a href="mailto:matthias@ccs.neu.edu" target="_blank">matthias@ccs.neu.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Did you want this:<br>
<div class=""><br>
#lang racket<br>
<br>
(require (for-syntax syntax/parse racket/syntax))<br>
<br>
(define-for-syntax funny #f)<br>
<br>
(define-syntax (make-funny-set! stx)<br>
  (syntax-parse stx<br>
</div>    [(_ v) #`(define #,(begin (set! funny (format-id stx "g")) funny) v)]))<br>
<div class=""><br>
(define-syntax (funny-ref stx)<br>
  (syntax-parse stx<br>
    [(_) funny]))<br>
<br>
(define-syntax (funny-set! stx)<br>
  (syntax-parse stx<br>
</div>    [(_ v) #`(set! #,funny v)]))<br>
<br>
(make-funny-set! 2)<br>
(void (void (void (funny-set! 3))))<br>
(funny-ref)<br>
<br>
[I had to write such a macro a while back, and the above is roughly what I remember doing. Note the lexical context]<br>
<div><div class="h5"><br>
<br>
On May 15, 2014, at 5:25 PM, Spencer Florence <<a href="mailto:spencer@florence.io">spencer@florence.io</a>> wrote:<br>
<br>
> I'm attempting to write a macro which introduces a new id, then another macro that set!s that id.<br>
> Example:<br>
><br>
> #lang racket<br>
> (require (for-syntax syntax/parse racket/syntax))<br>
> (define-for-syntax funny #f)<br>
> (define-syntax (make-funny-set! stx)<br>
>   (syntax-parse stx<br>
>     [(_ v)<br>
>      (define unmarked (generate-temporary))<br>
>      (set! funny (syntax-local-introduce unmarked))<br>
>      #`(define #,unmarked v)]))<br>
> (define-syntax (funny-ref stx)<br>
>   (syntax-parse stx<br>
>     [(_)<br>
>      funny]))<br>
> (define-syntax (funny-set! stx)<br>
>   (syntax-parse stx<br>
>     [(_ v)<br>
>      #`(set! #,(syntax-local-introduce funny) v)]))<br>
><br>
> (make-funny-set! 2)<br>
> (funny-set! 3)<br>
> (funny-ref)<br>
><br>
> 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"<br>
><br>
> I do not get this error if I change (funny-ref) to (void (funny-ref)).<br>
><br>
> 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.<br>
><br>
> 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.<br>
><br>
> Could someone explain whats going on?<br>
><br>
> --Spencer<br>
</div></div>> ____________________<br>
>  Racket Users list:<br>
>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
</blockquote></div><br></div>