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 <[email protected]>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 <[email protected]> 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

