for ループ とも呼ばれる for
式 は、loop
式 と同様ですが、for
式は処理を一定回数イテレートする点が異なります。つまり、for
ループが実行される前にイテレーション回数は認識されており、ループを終了するタイミングが自動的に決定されます。
パルス トリガーの仕掛けは、パルス トリガーの仕掛けで Looping 設定に数値を設定した、一定のイテレーションによる for
ループのサンプルです。パルス トリガーのパルスは、仕掛けの Looping 設定で指定した回数繰り返します。
これの例では 2 つの トリガーの仕掛け がパルス トリガーのパスにあります。パルス トリガーのパルスがトリガー仕掛けに到達するとき、仕掛けは ビルボード 仕掛けの 1 つにテキストを表示するための信号を送り、これを 3 回繰り返します。
コードでは、この例は次のようになります。
for (X := 0..2):
TriggerDevice1.Transmit()
TriggerDevice2.Transmit()
for
式には次の 2 つの部分があります。
- イテレーションの指定:かっこ内の式であり、最初の式は ジェネレータ であることが必要です。この例では、
(X := 0..2)
です。 - 本体:かっこの後の式です。この例では、
Transmit()
がある 2 行です。
ジェネレーター
ジェネレータでは、一連の 値 を一度に 1 つずつ生成して、その値に名前を付けます。この例でジェネレータは X := 0..2
であり、ループの各イテレーションで、ジェネレータは次の値を生み出し、値に X という名前を付けます。ジェネレータがシーケンスの最後に到達すると、for
ループは終了します。ループ変数に有効な値があるかどうかをチェックする決定フローは、for
式に組み込まれています。
ジェネレータがサポートするのは、範囲、配列 および マップ だけです。
範囲でのイテレーション
範囲 型 は、一連の整数 (たとえば、0..3
や Min..Max
) を表します。
範囲の先頭は式の最初の値 (たとえば、0
) であり、範囲の最後は式の ..
に続く値 (たとえば、3
) です。範囲には先頭と最後の値を含むすべての整数が含まれます。たとえば、範囲式 0..3
には 0
、1
、2
および 3
の数値が含まれます。
範囲式でサポートするのは、int
値だけで、for
、sync
、race
および rush
式のみで使用できます。
for (Number := 0 .. 3):
Log("{Number}")
この結果は数値 0
、1
、2
および 3
を含む 4 行がログに追加されます。
for
式は 配列 の各イテレーションから結果を返すことができます。次の例では、Numbers
は -1
から -10
までの int
値がある 不変 配列です。
Numbers := for (Number := 1..10):
-Number
配列またはマップでのイテレーション
配列やマップのイテレーションは、単なる値か、マップの キー / 値のペア および配列のインデックス / 値のペアです。
次の例では、配列の値のみが使用され、Values
は int
値 2
、3
および 5
がある不変配列です。
Values := for (X : array{1, 2, 4}):
X+1
同様にマップでも実行でき、この場合 ´Values は
int 値
3、
7` がある不変配列です。
Values := for (X := map{ 1=>3, 0=>7 }):
X
X->Y
パターンは、インデックス / 値のペアやキー / 値のペアを分解するために使用できます。インデックス (またはキー) は左部分 (X
) に関連付けられ、値は右部分 (Y
) に関連付けられます。
配列でのインデックス/値のペアの例では、Values
は int
値 1
、3
および 6
がある不変配列です。
Values := for ( X -> Y : array{1, 2, 4}) :
X + Y
マップでのインデックス/値のペアの例では、Values
は int
値 4
および 7
がある不変配列です。
Values := for ( X->Y := map{ 1=>3, 0=>7 }):
X + Y
フィルタ
失敗する可能性がある式 を for
式に追加して、ジェネレータから値を選別することができます。フィルタが失敗した場合、そのイテレーションに対して結果はなく、for
はジェネレータで生成された次の値にスキップします。
たとえば、フィルタ Num <> 0
が for
式に加えられると、返される結果から 0
を除外します。
NoZero := for (Number := -5..5, Number <> 0):
番号
意味としては、次のコードと同様です。
expression0
for (Item : Collection, test-arg-block):
expression1
expression2
定義
名前付きの式をイテレーション 指定 に追加することもでき、その名前をイテレーション指定と 本体 の両方で使用できます。
Values := for ( X := 1..5; Y:=SomeFunction(X); Y < 10):
Y
結果:すべての値が 10 未満である最大 5 個のアイテムからなる配列
ネスティングした for
1 つの for
ループを別の for
ループ内に ネスティング できます。次の 2 種類の方法があります。
-
単一の for 式: 複数のジェネレータで指定します。結果は一次元配列です。
-
複数の For 式:
for
ブロックを分離します。結果は多次元配列です。
以下のセクションでは、さらに説明します。
単一の For 式
ジェネレータを追加することで、単一の for
式で複数のループを設定できます。複数のジェネレータがある単一の for
式の結果は、一次元配列になります。
この例では、Values
は、int
値 13
、14
、23
および 24
がある不変配列です。
Values := for(X:=1..2, Y:=3..4):
X * 10 + Y
意味としては、次のコードと同様です。
expression0
for (Item : Collection, Item2 : Collection2):
expression1
expression2
複数の for 式
別の for ループの本体に for
式を加えて、ネスティングすることもできます。1 つの for
式は一次元配列を返しますが、for
式を 1 回ネスティングすると、二次元配列を返します。
この例では、Values
は、2 つの不変 int
配列がある不変配列です。最初の配列には値 13
と 14
が、2 番目の配列には 23
と 24
が含まれます。(これは array{ array{13, 14}, array{23, 24} }
と記述できる。)
Values := for ( X := 1..2 ):
for (Y := 3..4):
X * 10 + Y
失敗
イテレーション指定内で何かが失敗した場合は、そのイテレーションによる変更はすべて ロールバック されます。
for(X := 1..5; S := IncrementSomeVariable(); X < 3):
X
この for
式の結果は array{1,2}
です。for ループの評価後に IncrementSomeVariable
を 2 回だけコールします。フィルタ X < 3
が失敗したとき、他のコールがロールバックされたためです。