<p dir="ltr">Jay,</p>
<p dir="ltr">Section 1.1.10 does not really answer my question:<br>
I had no doubts in the first place about phase 0 and<br>
phase1 being separated from each other.</p>
<p dir="ltr">I am not so sure about whether the phase 1 data<br>
is shared between different "load chain" of a module.<br>
That has to to with visits and instantiatiins I beleive.<br>
I will keep reading, though would not mind if somebody<br>
points me to the answer directly.</p>
<p dir="ltr">Regards,</p>
<p dir="ltr">Dmitry</p>
<div class="gmail_quote">On Sep 24, 2013 11:47 PM, "Jay McCarthy" <<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The details of your answer are in Reference section 1.1.10<br>
<br>
<a href="http://docs.racket-lang.org/reference/eval-model.html#(part._module-eval-model)" target="_blank">http://docs.racket-lang.org/reference/eval-model.html#(part._module-eval-model)</a><br>
<br>
Basically, the runtime and compile time of every module is distinct<br>
and not shared between compiles of different modules. Racket<br>
guarantees that they are never shared, no matter how many modules are<br>
already (or not already) compiled when you start. You may think there<br>
is sharing, but there is not. Instead, when d runs it runs the syntax<br>
toplevel of b and c, despite having compiled them separately. (You<br>
could observe the difference if you changed your begin-for-syntax code<br>
into code that happens to run during the expansion of b and c.)<br>
<br>
The justification for this behavior is elaborated in Matthew Flatt's<br>
"Metaprogramming Time!" [1] and the paper "Composable and Compilable<br>
Macros" [2]<br>
<br>
Jay<br>
<br>
1. <a href="http://www.infoq.com/presentations/racket" target="_blank">http://www.infoq.com/presentations/racket</a><br>
2. <a href="http://www.cs.utah.edu/plt/publications/macromod.pdf" target="_blank">http://www.cs.utah.edu/plt/publications/macromod.pdf</a><br>
<br>
Jay<br>
<br>
On Tue, Sep 24, 2013 at 1:38 PM, Dmitry Pavlov <<a href="mailto:dpavlov@ipa.nw.ru">dpavlov@ipa.nw.ru</a>> wrote:<br>
> Hello,<br>
><br>
> I have a problem that originates from the fact that I do not<br>
> really understand the innards of the mechanism of module loading.<br>
><br>
> Basically, I want to share a hashtable stored in some module<br>
> between a number of other modules. Moreover, I want to do<br>
> that on the syntax level. In this example, I will do that<br>
> in parallel on run level and syntax level, showing problems<br>
> in the second case.<br>
><br>
> ~~~~~ a.rkt:<br>
><br>
> #lang racket<br>
> (provide h<br>
>          (for-syntax s-h))<br>
><br>
> (define h (begin (printf "making h\n") (make-hash)))<br>
><br>
> (define-for-syntax s-h  (begin (printf "making s-h\n") (make-hash)))<br>
><br>
><br>
> ~~~~~ b.rkt:<br>
><br>
> #lang racket<br>
><br>
> (require "a.rkt")<br>
> (hash-set! h 1 "x")<br>
> (begin-for-syntax<br>
>   (hash-set! s-h 1 "xx"))<br>
><br>
><br>
> ~~~~~ c.rkt:<br>
><br>
> #lang racket<br>
> (require "a.rkt")<br>
> (hash-set! h 2 "y")<br>
> (begin-for-syntax<br>
>   (hash-set! s-h 2 "yy"))<br>
><br>
> ~~~~~ d.rkt:<br>
><br>
> #lang racket<br>
> (require "a.rkt")<br>
> (require "b.rkt")<br>
> (require "c.rkt")<br>
><br>
> (define-syntax (print-s-h stx)<br>
>   (syntax-case stx ()<br>
>     ((_)<br>
>      (for (((key val) s-h))<br>
>        (printf "~a : ~a\n" key val))<br>
>      #'(void))))<br>
><br>
> (for (((key val) h))<br>
>   (printf "~a : ~a\n" key val))<br>
><br>
> (print-s-h)<br>
><br>
><br>
><br>
> What I get:<br>
><br>
> making s-h<br>
> making s-h<br>
> making s-h<br>
> making s-h<br>
> making s-h<br>
> making s-h<br>
> making s-h<br>
> 1 : xx<br>
> 2 : yy<br>
> making s-h<br>
> making s-h<br>
> making h<br>
> 1 : x<br>
> 2 : y<br>
><br>
><br>
> What I see: on the execution level everything works as I want.<br>
> (Is it guaranteed to work that way?)<br>
><br>
> On the syntax level, the hash table is created eight times instead<br>
> of (as I would expect) one, but still only one of the instances<br>
> is in action, and is shared across modules. Is it guaranteed to<br>
> work that way? In my real (more complicated) code a similar<br>
> hash table is not shared, and in effect, the "top" procedure gets<br>
> a fresh and empty instance of it, therefore I am in trouble.<br>
> I am wondering what are Racket's rules for sharing module data on the<br>
> syntax level.<br>
><br>
><br>
> Regards,<br>
><br>
> Dmitry<br>
> ____________________<br>
>  Racket Users list:<br>
>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
<br>
<br>
--<br>
Jay McCarthy <<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>><br>
Assistant Professor / Brigham Young University<br>
<a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
<br>
"The glory of God is Intelligence" - D&C 93<br>
____________________<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>