Выражения for
, иногда называемые циклами for
, аналогичны выражениям loop
, за исключением того, что выражения for
перебирают ограниченное число элементов. Это означает, что количество итераций известно до выполнения цикла for
и решение о том, когда выйти из цикла, принимается автоматически.
Устройство «Триггер импульса» служит примером цикла for
с ограниченным числом итераций, если задать для параметра Повторение устройства «Триггер импульса» определённое числовое значение. Импульс устройства «Триггер импульса» повторяется столько раз, сколько задано этим параметром устройства.

В этом примере на пути устройства «Триггер импульса» находятся два устройства «Триггер импульса». Когда импульс триггера импульса достигает устройства «Триггер», устройство передаёт сигнал для отображения текста на одном из устройств «Рекламный щит» и повторяет это три раза.
Вот пример кода, реализующего этот пример:
for (X := 0..2):
TriggerDevice1.Transmit()
TriggerDevice2.Transmit()
Выражение for
состоит из двух частей:
- Спецификация итераций: выражения в скобках и первое выражение должны быть генератором. В данном примере это
(X := 0..2)
. - Тело: выражения после круглых скобок. В данном примере это две строки с
Transmit()
.

Генератор
Генератор задаёт последовательность значений, по одному за раз, и присваивает значениям имена. В данном примере генератором является 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
.
Выражение for
может возвращать результаты каждой итерации в массив. В следующем примере Numbers
— это неизменяемый массив со значениями int
от -1
до -10
.
Numbers := for (Number := 1..10):
-Number
Перебор массива или ассоциативному массива
Результатом перебора массивов и ассоциативных массивов могут быть либо просто значения, либо пары «ключ-значение» у ассоциативных массивов и пары «индекс-значение» у обычных массивов.
В данном случае используются только значения массива, а Values
— это неизменяемый массив со значениями 2
, 3
и 5
типа int
.
Values := for (X : array{1, 2, 4}):
X+1
То же самое можно сделать с ассоциативным массивом, и Values
в этом случае является неизменяемым массивом со значениями 3
, 7
типа int
.
Values := for (X := map{ 1=>3, 0=>7 }):
X
Структуру X->Y
можно использовать для декомпозиции пары «индекс-значение» или «ключ-значение». Индекс (или ключ) привязывается к левой части (X
), а значение — к правой части (Y
).
В примере пар «индекс-значение» из обычного массива Values
— это неизменяемый массив со значениями 1
, 3
и 6
типа int
.
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
Результат: массив, содержащий не более 5 элементов, значения которых меньше 10.
Вложенный цикл for
Вы можете вложить цикл for
в другой цикл for
. Это можно сделать двумя способами:
-
Одиночное выражение
for
: определяется несколькими генераторами. Результатом является одномерный массив. -
Множественные выражения
for
: отдельные блокиfor
. Результатом является многомерный массив.
В следующих разделах они описаны подробнее.
Одиночное выражение for
Можно реализовать несколько циклов в одном выражении for
, добавив дополнительные генераторы. Результатом одиночного выражения for
с несколькими генераторами является одномерный массив.
В этом примере Values
— это неизменяемый массив со значениями 13
, 14
, 23
и 24
типа int
.
Values := for(X:=1..2, Y:=3..4):
X * 10 + Y
Семантически это то же самое, что и
expression0
for (Item : Collection, Item2 : Collection2):
expression1
expression2

Множественные выражения for
Также можно вложить выражение for
в тело другого цикла for
. Поскольку одно выражение for
возвращает одномерный массив, при наличии вложенного выражения for
код возвращает двумерный массив.
В данном случае Values
представляет собой неизменяемый массив с двумя неизменяемыми массивами типа int
. Первый массив содержит значения 13
и 14
, а второй массив содержит 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
, потому что был произведён откат других вызовов, когда фильтр X < 3
не вернул результат.