私の理解では、forall
ステートメントは並列に実行されますが、for
ステートメントはシリアルに実行されます。実際、次のコードはこの予想を裏付けているようです (つまり、forall
スレッドのためだけのランダム シーケンス)。
for i in 1..5 do writeln( i * 10 );
10
20
30
40
50
forall i in 1..5 do writeln( i * 10 );
10
50
20
30
40
一方、式として右側にforall
(または同等の [...] ) を使用すると、
var A = ( forall i in 1..5 do i * 10 );
var B = [ i in 1..5 ] i * 10;
var X = ( forall a in A do a );
var Y = [ a in A ] a;
var P = ( for i in 1..5 do i * 10 ); // for comparison
writeln( "A = ", A );
writeln( "B = ", B );
writeln( "X = ", X );
writeln( "Y = ", Y );
writeln( "P = ", P );
すべての結果が同じになります (つまり、10 から 50 に並べ替えられます)。
A = 10 20 30 40 50
B = 10 20 30 40 50
X = 10 20 30 40 50
Y = 10 20 30 40 50
P = 10 20 30 40 50
これはforall
、代入の右辺の式が常にシリアルに実行されるということですか? for
もしそうなら、対応する [...] もこのコンテキストの式と同等ですか?