Ресиверы RE/BR/CO
(повторить – прервать – продолжить)


ERA дала возможность, помимо всего прочего, использовать для написания ERM-скриптов скоростные циклы высокого уровня через новые ресиверы: !!re, !!br, !!co.


!!re $1[/#2/#3/#4]:;
   …
!!en:;

Повторяет блок кода. Только первый аргумент ($1) обязателен.

         $1 – переменная счётчика цикла (любая числовая локальная или глобальная переменная)
         #2 – начальное значение счётчика (опционально). По умолчанию: значение переменной-счётчика цикла.
         #3 – конечное значение счётчика (опционально). По умолчанию: начальное значение счётчика цикла.
         #4 – шаг цикла (опционально). По умолчанию: 1, если установлено значение для #3, в противном случае будет равно 0.
Пример: Комментарии (показать)
Сначала инициализируется переменная счётчика цикла.
Значения #2 и #3 запоминаются для всего цикла и не будут оцениваться на каждой итерации (повторе).
Шаг определяет, какое значение необходимо добавить в переменную счётчика после каждой итерации. Он также определяет тип условия остановки итерации.
Положительный шаг проверяет, является ли значение $1>#3.
Отрицательный шаг проверяет, является ли значение $1<#3.

Логика работы ресивера такова:

Пример: Максимально допустимо 16 вложенных блоков !!if / !!re.
Замечание: !!re не поддерживает непосредственное использование условий, однако ничто не мешает вам использовать "обёртывание" цикла ресивером !!if.

Циклы для большинства задач имеют тип WHILE DO, то есть с возможностью нуля итераций. Но тем не менее, !!re позволяет писать любые: от FOR i FROM x TO y BY step, до LOOP и DO WHILE.
Пример:

Для ресиверов контроля циклов !!br / !!co существует поддержка уровней циклов.
!!br 1:; равнозначно !!br:; и означает прервать текущий (наиболее вложенный) цикл.
!!br 2:; прервёт цикл на уровень выше, а !!br 3:; – ещё выше по уровню, и т.д. …
Пример: