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