Wyrażenia for
, czasem nazywane pętlami for, są tym samym co wyrażenia loop
, z tą różnicą, że wyrażenia for
przeprowadzają iterację po ograniczonej liczbie elementów. Oznacza to, że liczba iteracji jest znana przed wykonaniem pętli for
, a decyzje o tym, kiedy wyjść z pętli, są podejmowane automatycznie.
Urządzenie Wyzwalacz impulsowy jest przykładem pętli for
z ograniczonymi iteracjami, gdy urządzenie Wyzwalacz impulsowy jest ustawione na określoną Liczbę zapętleń. Wyzwalacz impulsowy powtarza się tyle razy, ile określono w ustawieniu pętli urządzenia.

W tym przykładzie dwa urządzenia aktywatorów są na ścieżce urządzenia. Gdy impuls urządzenia Wyzwalacz impulsowy dotrze do urządzenia aktywatora, urządzenie wysyła sygnał w celu wyświetlenia tekstu na jednym z billboardów i powtarza to trzykrotnie.
Jako kod ten przykład mógłby wyglądać następująco:
for (X := 0..2):
TriggerDevice1.Transmit()
TriggerDevice2.Transmit()
Wyrażenie for
składa się z dwóch części:
- Specyfikacja iteracji: Wyrażenia w nawiasach i pierwsze wyrażenie muszą być generatorem. W tym przykładzie jest to
(X := 0..2)
. - Korpus: Wyrażenia po nawiasach. W tym przykładzie są to dwa wiersze zawierające
Transmit()
.

Generator
Generator tworzy sekwencję wartości, jedną na raz, i nadaje wartości nazwę. W tym przykładzie generatorem jest X := 0..2
, więc w każdej iteracji pętli generator tworzy następną wartość i nadaje jej nazwę X. Gdy generator osiągnie koniec sekwencji, pętla for
kończy się. Ten przepływ decyzji dotyczący sprawdzania, czy zmienna pętli ma prawidłową wartość, jest wbudowany w wyrażenie for
.
Generatory obsługują wyłącznie zakresy, tablice i mapy.
Iteracja po zakresie
Typ zakresu reprezentuje serię liczb całkowitych, na przykład 0..3
i Min..Max
.
Początkiem zakresu jest pierwsza wartość w wyrażeniu, na przykład 0
, a końcem zakresu jest wartość następująca po ..
w wyrażeniu, na przykład 3
. Zakres zawiera wszystkie liczby całkowite między pierwszą a ostatnią wartością włącznie. Na przykład wyrażenie zakresu 0..3
zawiera liczby 0
, 1
, 2
i 3
.
Wyrażenia zakresu obsługują wyłącznie wartości int
i można ich używać wyłącznie w wyrażeniach for
, sync
, race
oraz rush
.
for (Number := 0 .. 3):
Log("{Number}")
W rezultacie do dziennika zostaną dodane cztery wiersze zawierające liczby 0
, 1
, 2
i 3
.
Wyrażenie for
może zwracać wyniki każdej iteracji w postaci tablicy. W poniższym przykładzie Numbers
jest niemodyfikowalną tablicą z wartościami int
od -1
do -10
.
Numbers := for (Number := 1..10):
-Number
Iteracja po tablicy lub mapie
Iteracje po tablicach i mapach mogą być tylko wartościami lub parą klucz-wartość w przypadku map i parą indeks-wartość w przypadku tablic.
W tym przypadku używane są tylko wartości tablicy, a Values
jest niemodyfikowalną tablicą z wartościami int
2
, 3
i 5
.
Values := for (X : array{1, 2, 4}):
X+1
To samo można zrobić z mapą, a ´Values jest w tym przypadku niemodyfikowalną tablicą z wartościami
int
3,
7`.
Values := for (X := map{ 1=>3, 0=>7 }):
X
Wzoru X->Y
można użyć do dekonstrukcji pary indeks-wartość lub klucz-wartość. Indeks (lub klucz) jest powiązany z lewą częścią (X
), a wartość jest powiązana z prawą częścią (Y
).
Przykład par indeks-wartość z tablicy. Values
jest niemodyfikowalną tablicą z wartościami int
1
, 3
i 6
.
Values := for ( X -> Y : array{1, 2, 4}) :
X + Y
Przykład par indeks-wartość z mapy. Values
jest niemodyfikowalną tablicą z wartościami int
4
i 7
.
Values := for ( X->Y := map{ 1=>3, 0=>7 }):
X + Y
Filtrowanie
Do wyrażenia for
można dodać wyrażenia zawodne, aby wyfiltrować wartości z generatora. Jeśli zastosowanie filtru nie powiedzie się, nie będzie wyniku dla tej iteracji, a for
przeskoczy do następnej wartości wygenerowanej przez generator.
Na przykład do wyrażenia for
zostaje dodany filtr Num <> 0
, aby wykluczyć 0
ze zwracanych wyników.
NoZero := for (Number := -5..5, Number <> 0):
Liczba
Pod względem składni to jest to równoznaczne z następującym zapisem:
wyrażenie0
for (Item : Collection, test-arg-block):
wyrażenie1
wyrażenie2

Definicja
Do specyfikacji iteracji można również dodać nazwane wyrażenia, a nazwy można użyć zarówno w specyfikacji iteracji, jak i w korpusie.
Values := for ( X := 1..5; Y:=SomeFunction(X); Y < 10):
Y
Wynik: tablica z maksymalnie 5 elementami, w której wszystkie wartości są mniejsze niż 10.
Zagnieżdżone wyrażenie for
Pętlę for
można zagnieździć wewnątrz innej pętli for
. Można to zrobić na dwa sposoby:
-
Pojedyncze wyrażenie for: Określone przez wiele generatorów. Wynikiem jest jednowymiarowa tablica.
-
Wiele wyrażeń for: Oddzielne bloki
for
. Wynikiem jest wielowymiarowa tablica.
Więcej informacji na ten temat znajduje się w poniższych sekcjach.
Pojedyncze wyrażenie for
W pojedynczym wyrażeniu for
można uzyskać wiele pętli, dodając więcej generatorów. Wynikiem pojedynczego wyrażenia for
z wieloma generatorami jest jednowymiarowa tablica.
W tym przykładzie Values
jest niemodyfikowalną tablicą z wartościami int
13
, 14
, 23
i 24
.
Values := for(X:=1..2, Y:=3..4):
X * 10 + Y
Semantycznie jest to równoznaczne z następującym zapisem:
wyrażenie0
for (Item : Collection, Item2 : Collection2):
wyrażenie1
wyrażenie2

Wiele wyrażeń for
Wyrażenie for
można też zagnieździć w innym korpusie pętli for. Skoro jedno wyrażenie for
zwraca tablicę jednowymiarową, zagnieżdżenie wyrażenia for
zwraca tablicę dwuwymiarową.
W tym przypadku Values
jest niemodyfikowalną tablicą z dwiema niemodyfikowalnymi tablicami int
. Pierwsza tablica zawiera wartości 13
i 14
, a druga tablica zawiera 23
i 24
(można to zapisać jako array{ array{13, 14}, array{23, 24} }
).
Values := for ( X := 1..2 ):
for (Y := 3..4):
X * 10 + Y
Niepowodzenie
Jeśli cokolwiek w specyfikacji iteracji zakończy się niepowodzeniem, wszelkie zmiany wynikające z tej iteracji zostaną wycofane.
for(X := 1..5; S := IncrementSomeVariable(); X < 3):
X
Wynikiem tego wyrażenia for
jest array{1,2}
z tylko dwoma wywołaniami IncrementSomeVariable
po ocenie pętli for, ponieważ pozostałe wywołania zostały wycofane, gdy filtr X < 3
zakończył się niepowodzeniem.