On 8/16/2017 3:34 PM, Zelphir Kaltstahl wrote:
Just a few quick questions regarding the places code:
1. Is `?` like `if`? For me it says that it is an undefined identifier.
Um? ... I think that probably is a lambda glyph that didn't render for
you. If you are looking at
(let [
(output (lambda (fmt . whatever)
(apply eprintf fmt whatever)
(flush-output (current-error-port))
))
:
then that surely is the case.
That special output function is an artifact of wanting to print on the
console from the place. Normally stderr to a process is unbuffered,
however a place is just a kernel thread running a separate copy of the
Racket VM. Racket (or maybe the DrRacket debugger) buffers stderr for
places, so the port has to be flushed to see output as it happens rather
than waiting for the place to terminate or the buffer to fill up.
Places support stdio so they can be pipelined like Unix processes, but
in practice most interactions with them should be through channel
messaging. Channel descriptors, file handles, tcp ports, etc. all can
be passed around via messages, so you can implement arbitrarily complex
connection schemes using messaging that are impossible using simple pipes.
2. If I understand correctly, the place is looping and in each iteration is
looks if there is a message on the channel, which matches something. Is this
creating a lot of extra work for looking on the channel all the time?
Yes. A place terminates when its last instruction is executed, so you
need to use a loop to keep it alive. Channels are signaling objects
(event sources). 'place-channel-get' blocks until there is a message
available or until the channel is closed.
3. What are `p`, `_i`, `_o` and `_e` doing?
The 'place*' call returns 4 values: a channel to the new place, and the
ports bound to its stdio. 'p' is the channel - the only value I'm
interested in. The others are placeholders. Unfortunately, with
multiple value returns, Racket [like Scheme] doesn't allow for ignoring
don't cares - you have to catch all the values.
4. Could I replace `set!-values` with a `let`?
No, but you could replace it with 'let-values'.
Or you could use 'place' which returns a single value (the channel)
instead of 'place*' which returns 4. I chose 'place*' specifically
because I wanted console output from the places and needed to pass the
stdio port to them.
https://docs.racket-lang.org/reference/places.html
It's a matter of style. I prefer to limit nesting levels (or use let*)
because indentation quickly gets out of control. YMMV. From a
technical perspective, binding code is somewhat faster than assignment
code - but in practice with the current compiler the difference rarely
matters. And starting places is a slow process anyway.
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.
For more options, visit https://groups.google.com/d/optout.