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.

Reply via email to