Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Every input expression is associated with the namespace of the names it is listening on.  Cross-namespace joins are forbidden, so the namespace is unique.  Every output expression is associated with the namespace of the name being sent on.  When sending or listening on a public name, it must be annotated with a namespace.  Every new production annotates each new name with a namespace.  Other productions live in the nearest enclosing input.

...

Mobility

Consider the case where b is in the namespace B, y is in the namespace Y, and the following process is running (necessarily in the namespace B by the previous paragraph):

...

but that ought to run in the namespace Y, so B then deploys transfers y!(Q) to Y and removes it from its own state.


A datafeed gets implemented as followsSimilarly, consider the case where b is in the namespace B, y is in the namespace Y, and the following process is running in B:

    new ret in {
dataFeed!(ret) |
for (datafor(a <- b) { for (c <- reta) {
Q } } | handleb!(data*y)

The process reduces to

    for (c }
<- y) { Q }

but that ought to run in the namespace Y, so B then transfers for (c <- y) { Q } to Y and removes it from its own state.


In both cases, the validators in Y need to receive enough messages from B that Y can be sure that B won't roll back the transfer.

Joins

Joins between names that are not in the same namespace is a type error.  If a process in the namespace B and a process in the namespace Y wish to race, then they should send messages to a process in the namespace B∨Y. 

...