Thanks. I feel better knowing there will be a fresh instantiation for every compile now I just have to trace through some stuff I didn’t quite get. That should be enough for me to go on.
Nate > On Oct 7, 2020, at 9:18 PM, Sam Tobin-Hochstadt <[email protected]> wrote: > > Every module is indeed compiled with a fresh context. The untyped > module doesn't directly refer to typed-racket/utils/tc-utils, which is > the file that defines typed-context?, but it does refer to a typed > module, whose expansion will contain a reference to that module. > Consider: > > #lang typed/racket > (provide f) > (define (f [x : Integer]) (+ x 1)) > > That expands to (among a lot of other things): > > (define-values (f) (lambda (x) (#%app + x '1))) > (define-syntaxes (f.1) (#%app make-redirect2 (quote-syntax f.3))) > (define-syntaxes > (f.2) > (#%app make-typed-renaming (t-quote-syntax f) (t-quote-syntax f.1))) > > Where f.2 is provided as f, and f.3 is the contracted version of the > identifier. > > Then `make-typed-renaming` is effectively `(lambda (a b) (lambda (stx) > (if (unbox typed-context?) a b)))` > > So it's the definition of `f` that depends on the box, and so there's > a fresh instantiation of `tc-utils` for every module that gets > expanded that depends on the typed module above. > > Hopefully that clarifies things a bit more. > > Sam > >> On Wed, Oct 7, 2020 at 10:07 PM Nathaniel Griswold >> <[email protected]> wrote: >> >> Hm, I have this two reads for a over and I didn’t quite get it. I thought >> every module was compiled in a fresh context so my issue is I’m wondering >> how that identifier for the box is defined for syntax expansion in untyped >> modules. Maybe you understand what I mean; otherwise I’ll give the paper a >> look later tonight or tomorrow to see what I’m missing here. >> >> Thanks >> >>>> On Oct 7, 2020, at 8:44 PM, Sam Tobin-Hochstadt <[email protected]> >>>> wrote: >>> >>> The way this works, the box doesn't have to "get into" any modules >>> that aren't typed. Instead, when expanding a module A, that module >>> may contain uses of identifiers defined in a typed module T. Those >>> identifiers are macros that look something like this: >>> >>> (define-syntax (id stx) (if typed-context? #'typed-id #'id-for-untyped)) >>> >>> Furthermore, the typed-context? value is initially set to #f, and it's >>> set to #true only inside the typechecker. When `id` is used in an >>> untyped module, it never gets set to #true, and so the >>> `id-for-untyped` is used. That means that the untyped code doesn't >>> need to know or do anything to make the system work, which is >>> necessary for Typed Racket to be a library. >>> >>> There's more detail about this in our Scheme Workshop paper, here: >>> https://www2.ccs.neu.edu/racket/pubs/scheme2007-ctf.pdf >>> >>> Sam >>> >>> >>>> On Wed, Oct 7, 2020 at 6:18 AM Nate Griswold <[email protected]> >>>> wrote: >>>> >>>> I just finished reading the paper "Languages as Libraries", which really >>>> helped as an introduction to racket's language system (i had previously >>>> been ignoring the syntax features). >>>> >>>> I did have one question from it, which wasn't quite made clear in the >>>> interoperability section, or so it seems: how does the box >>>> `typed-context?` get into the modules that are not part of that language? >>>> Or more generally how would you solve this problem of needing to know >>>> which language of a module you are in without modifying the other >>>> languages? I was wondering if it was a hackaround or if there was a way to >>>> do generically in any language i might make. >>>> >>>> I grepped the source code and it looks like it's even exposed to the user >>>> in a function `syntax-local-typed-context?`, but i noticed that module >>>> never actually imports `typed-context?`. >>>> >>>> I suppose if it is a hack i could just reflect on the namespace to solve >>>> the problem, but i thought i would send a mail here to check. >>>> >>>> Thanks for the great work everyone! >>>> >>>> Nate >>>> >>>> -- >>>> You received this message because you are subscribed to the Google Groups >>>> "Racket Developers" group. >>>> To unsubscribe from this group and stop receiving emails from it, send an >>>> email to [email protected]. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/racket-dev/CAM-xLPpey6e2S_JsBi_ZA_0OAC%2Bh8NJDrVYRv63fWmYrWiig1A%40mail.gmail.com. -- You received this message because you are subscribed to the Google Groups "Racket Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-dev/840DECD2-34FA-4EB5-92BE-533C6F546242%40gmail.com.
