Parallel Iterations¶
The loop construction iterates the triggering of a group (the loop body): one body instance is triggered after the other, with a given interval (the loop period). The action ForAll (for parallel iteration) instantiates a group in parallel for each element in an iteration set. The simplest example is the iteration on the elements of a tab:
$t := tab [1, 2, 3]
forall $x in $t
{
(3 - $x) print OK $x " at time" (3 - $x) " = (3 - " $x ")"
}
will trigger in parallel a group for each element in the tab referred by
$t
. For each group, the iterator variable $x
takes the value of its corresponding element in the tab. It is
implicitly a local variable, not visible outside the ForAll
body.
The result of this example is to print
in sequence
OK 3 at time 0 = (3 - 3)
OK 2 at time 1 = (3 - 2)
OK 1 at time 2 = (3 - 1)
The general form of a parallel iteration is:
forall $var in expression
{
; action sequence
}
where expression
evaluates to a int
, a tab
or a proc
:
-
If the iteration set n is an int, the values of the iterator are the integers 0, ..., (n-1)\; if n is positive, and (n+1), (n+2), ..., 0\; if n is negative.
-
If the iteration set is a tab, the values of the iterator are the tab's elements.
-
If the iteration set is a proc or an obj, the values of the iterator are the exec that correspond to the proc's or obj's instances.
Parallel iterations also accept a map for the iteration set. In this case, the syntax introduces two variables to refers to the keys and the values in the map:
$m := map { (1, "one"), (2, "two"), (3, "three") }
forall $k, $v in $m
{
print $k " => " $v
}
will print:
1 => one
2 => two
3 => three
There is also a parralel iteration expression allowed only in the context of a function definition, see the section extended expressions.