On 20/03/18 11:56, Philip McGrath wrote:
> Mutable values generally cannot be sent as messages on place channels.
> ("To a first approximation, place channels support only immutable,
> transparent values as messages."
> http://docs.racket-lang.org/reference/places.html The documentation for
> `place-message-allowed?` is also specific that only "immutable prefab
> structures containing message-allowed values" are accepted.)
>
> The reason for this restriction becomes clear if we think of places as
> separate instances of the Racket VM. With Racket threads, mutable values
> can be shared among all threads running concurrently, so mutation has
> the expected effect and changes that shared structure. With places, only
> values explicitly created in the shared memory space (via functions like
> `shared-bytes`) are shared. An instance of a struct received from a
> place channel isn't connected to the instance sent from a different
> place: mutating one wouldn't change the other. With things like vectors
> and hash tables where Racket has both mutable and immutable variants,
> place channel operations automatically convert mutable values to
> immutable ones for convenience, but there is no such substitution for
> user-defined data types.
>
I understand all you say but allowing prefab structs to be mutable and
then creating different behaviours with #s() and through direct
constructor call is a gotcha I did not expect and my question was
really, why is this allowed?
What's then the advantage of allowing prefab structs to be marked as
mutable?
> If you need to send mutable structures across place channels, I would
> suggest that you first serialize them with racket/serialize, then send
> the serialized representation across the place channel.>
Yes, that seems to be the alternative, thanks.
> -Philip
>
> On Tue, Mar 20, 2018 at 5:39 AM, 'Paulo Matos' via Racket Users
> <[email protected] <mailto:[email protected]>>
> wrote:
>
> Hi,
>
> I was quite surprised by a 'feature' of prefab mutable structures:
> #lang racket
>
> (struct f (a b)
> #:prefab
> #:mutable)
>
> (place-message-allowed? (f 1 2))
> (place-message-allowed? #s(f 1 2))
>
> I was expecting both to return true but to my amazement it was not the
> case. The one created with #s(...) returned true while the other
> returned false. This is surprising because I thought I had read
> everything about prefabs and never seen this distinction being
> discussed.
>
> Any reasons for this to happen?
>
> --
> Paulo Matos
>
> --
> 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]
> <mailto:racket-users%[email protected]>.
> For more options, visit https://groups.google.com/d/optout
> <https://groups.google.com/d/optout>.
>
>
> --
> 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]
> <mailto:[email protected]>.
> For more options, visit https://groups.google.com/d/optout.
--
Paulo Matos
--
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].
For more options, visit https://groups.google.com/d/optout.