Join-patterns are first used to define fresh port names.
The simple pattern a(x1,... ,xn)
is a definition for a channel a of arity n. Sending n values
v1, ...,vn on a results in the firing of a
with the variables x1, ...,xn bound to
The variables x1, ...,xn are much like formal
parameters and their scope restricts to the guarded process.
If a is a synchronous name, then an implicit continuation argument
is created, which follows the same scope restrictions as other arguments.
Join-patterns also are templates that are the basic synchronization
construct in the join-calculus. A join-pattern of the kind a1(x1, ... ,xm)|
... |an(y1, ... ,yl) defines
the port names a1, ...an. It also expresses a
synchronization between these names.
When concurrent invocations on the port names
a1, ...an are present, the join-pattern is enabled and some
action is to be taken. The action is to fire a process that is guarded
by the pattern.
At that time, the formal parameters x1 ,..., xm,
..., y1 , ..., yl,
are bound to the actual values given as arguments to the
names a1, ..., an.
Patterns are linear: a variable cannot appear several times in
a given pattern. This applies both to port names and formal arguments.
At the moment, there are no anonymous formal parameters: formal
arguments must all be variables.