Thanks, George. This helped a lot. On Wed, Apr 7, 2021 at 9:03 PM George Neuner <[email protected]> wrote: > > > On 4/7/2021 5:34 PM, David Storrs wrote: > > I'm trying to expand a task manager to optionally use places and I'm > > having some trouble understanding the issue. > > > > ; test.rkt > > #lang racket > > (provide start) > > (define (start thnk) > > (sync (place ch (place-channel-put ch (thnk))))) > > > > ; x.rkt > > #lang racket > > (require "test.rkt") > > (start (thunk 'ok)) > > > > Result: ; identifier used out of context: #<[...]/test.rkt:5:19 thnk> > > > > I know that the place is creating a submodule which closes over the > > place id ('ch') and the top level declarations, meaning only 'start'. > > The argument to start is not at top level so it's invisible in the > > submodule, meaning that the place code can't use it. > > > > I feel like parallelizing a function at runtime should be a primary > > use case for places but I'm not sure how to progress. > > Things I tried: > > > > *) Passing the thunk in via place-channel-put, but functions are > > place-message-allowed? #f. > > *) Creating a top-level parameter into which I put the thnk at > > runtime. Same problem. > > > > Am I fundamentally misunderstanding something? > > It helps if you think about places as being separate processes (even > when they aren't). > > Dynamic places (threads in same process) can see code that is in scope > at the point where the place is created. This includes top level > functions in the module that created the place. In your example 'thunk' > was created in a different module so the place didn't know about it. > > There are ways to communicate new code to a place - very useful for > distributed (separate process) places, but also works with dynamic > places if you can't arrange that everything they need is visible to them > at creation. > > 1. send the name of a (local to the place) file to be dynamically required > 2. send the file itself and have the place save it locally before > requiring it > 3. send serialized functions and have the place instantiate them > > Obviously, the place must have startup code available to it which > understands how to load / execute new code. > > > Take a look at 'serialize', 'serial-lambda', and 's-exp->fasl'. Also > see Tony Garnok's racket-reloadable project: > https://github.com/tonyg/racket-reloadable > > > Hope this helps, > George >
-- 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]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CAE8gKod%3D78B5Ls6ybZESsbYs5RVw4yf7xRniaoiyNpG_nG6jmg%40mail.gmail.com.

