Ah, okay, that makes sense, and fixed my issue. Thank you very much.

~Leif Andersen


On Thu, Dec 17, 2015 at 4:13 PM, Matthew Flatt <[email protected]> wrote:
> A short answer: When compiling a submodule, as for any other module,
> imported modules get fresh compile-time instantiations. It you want to
> run effects from the enclosing module (which is an implicit import),
> the effects must be in `begin-for-syntax`.
>
>
> A long answer:
>
> When you write
>
>  (module+ test ....)
>
> then all of the `test` parts are assembled together at the end of the
> enclosing module in a single `(module* test #f ....)` form.
>
> So,
>
>  (define-syntax x-top (stx-box #'yellow))
>
>  (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))
>
> is the same as
>
>  (define-syntax x-top (stx-box #'yellow))
>
>  (define-syntax x1 (syntax-local-value #'x-top))
>
>  (set-stx! x-top blue)
>
>  (define-syntax x2 (syntax-local-value #'x-top))
>
>  (module* test #f
>    x1
>    x2)
>
> where `x1` and `x2` each stand for `x` with some distinct scope.
>
>
> By the time the enclosing module is expanded, but before its submodules
> are expanded, that becomes
>
>  (define-syntax x-top (stx-box #'yellow))
>
>  (define-syntax x1 (syntax-local-value #'x-top))
>
>  (void)
>
>  (define-syntax x2 (syntax-local-value #'x-top))
>
>  (module* test #f
>    x1
>    x2)
>
> Note that the `(set-stx! ....)` form has been macro-expanded away.
>
> The process of expanding the `test` module then creates a new
> compile-time instantiation of the enclosing module. Since the
> `set-stx!` form has been expanded away to `(void)`, there's no change
> to `x-top` during that instantiation.
>
>
> Replace the definition of `set-stx!` with
>
>  (define-syntax (set-stx! stx)
>    (syntax-case stx ()
>      [(_ box value)
>       #'(begin-for-syntax
>           (define-values (x y) (syntax-local-value/immediate #'box))
>           (set-stx-box-stx! x #'value))]))
>
> Now, the expansion of the outer module is
>
>  (define-syntax x-top (stx-box #'yellow))
>
>  (define-syntax x1 (syntax-local-value #'x-top)])
>
>  (begin-for-syntax
>    (define-values (x y) (syntax-local-value/immediate #'x-top))
>    (set-stx-box-stx! x #'blue))
>
>  (define-syntax x2 (syntax-local-value #'x-top)])
>
>  (module* test #f
>    x1
>    x2)
>
> As usual (i.e., as in sense of "Composable and Compilable Macros"),
> using `begin-for-syntax` preserves the effect for all future
> compile-time instantiations of the enclosing module. That way, you get
> "yellow" followed by "blue", as you wanted.
>
>
>
> At Thu, 17 Dec 2015 15:08:06 -0500, Leif Andersen 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.

-- 
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