Also, I should point out that if I wasn't using module+, I get the
expected output:
"yellow"
"blue"
So I think it is due to the module+ macro pulling up the expression
past the assignment.
(This can be seen with the following code that is missing the module+ modules.)
#lang racket
(require racket/splicing)
(define-syntax (yellow stx) #'"yellow")
(define-syntax (blue stx) #'"blue")
(begin-for-syntax
(struct stx-box (stx)
#:mutable
#:transparent
#:property prop:rename-transformer
(lambda (inst)
(syntax-property (stx-box-stx inst) 'not-free-identifier=? #t))))
(define-syntax (set-stx! stx)
(syntax-case stx ()
[(_ box value)
(begin
(define-values (x y) (syntax-local-value/immediate #'box))
(set-stx-box-stx! x #'value)
#'(void))]))
(define-syntax x-top (stx-box #'yellow))
(splicing-let-syntax ([x (syntax-local-value #'x-top)])
x)
(set-stx! x-top blue)
(splicing-let-syntax ([x (syntax-local-value #'x-top)])
x)
~Leif Andersen
On Thu, Dec 17, 2015 at 3:08 PM, Leif Andersen <[email protected]> wrote:
> Hello,
>
> I am noticing that if I in the body of splicing-let-syntax I put a
> module+, or anything that lifts with
> syntax-local-lift-module-end-decloration really, The stuff that gets
> lifted out doesn't seem to match what I would expect it to. I suspect
> this is in part do to using prop:rename-transformer, and mutable
> structs, but I don't want to use a syntax-parameter because I would
> like to parameterize over an identifier.
>
> Here is the code I have:
>
> #lang racket
>
> (require racket/splicing)
>
> (define-syntax (yellow stx) #'"yellow")
> (define-syntax (blue stx) #'"blue")
>
> (begin-for-syntax
> (struct stx-box (stx)
> #:mutable
> #:transparent
> #:property prop:rename-transformer
> (lambda (inst)
> (syntax-property (stx-box-stx inst) 'not-free-identifier=? #t))))
> (define-syntax (set-stx! stx)
> (syntax-case stx ()
> [(_ box value)
> (begin
> (define-values (x y) (syntax-local-value/immediate #'box))
> (set-stx-box-stx! x #'value)
> #'(void))]))
>
> (define-syntax x-top (stx-box #'yellow))
>
> (define-syntax y-top 52)
>
> (splicing-let-syntax ([x (syntax-local-value #'x-top)])
> (module+ test
> x))
>
> (set-stx! x-top blue)
>
> (splicing-let-syntax ([x (syntax-local-value #'x-top)])
> (module+ test
> x))
>
> When I run it out I get:
> "yellow"
> "yellow"
>
> What I would like to get is:
> "yellow"
> "blue"
>
> Is there any better way to do this, and still have x be an identifier
> that is bound to the correct string?
>
> Thank you very much.
>
> ~Leif Andersen
--
You received this message because you are subscribed to the Google Groups
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.