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 racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/5559332c-4849-795c-94b5-884dfb29d75f%40comcast.net.

Reply via email to