Операторы циклов

Для записи циклов используются оператор <->, который ставится между условием цикла (проверкой логического выражения) и телом цикла. Условие цикла записывается в квадратных скобках и в зависимости от взаимного расположения цикл может быть с предусловием (while) или постусловием (dowhile):

    [условие while] <-> {
        тело цикла while
    };

    {
        тело цикла do while
    } <-> [условие do while];

Цикл с предусловием (while) поддерживает конструкцию else, которая выполняется, если условие входа в цикл не было выполнено.

Внимание! Это поведение отличается от аналогичных конструкций в языке Python, у которого секция else выполняется всегда, кроме прерывания цикла по break.

Ветка else у оператора цикла записывается так же как и ветка иначе в условном операторе, т.е.

    [ cond ] <-> {
        ...
    },[...] --> {
        ...
    };

Или тоже самое, но с использованием макросов из модуля dsl:

    @while(cond) {
        ...
    } @else {
        ... # Выполнится, только если cond будет false при входе в цикл
    };

Пример реализации цикла foreach для суммирования всех элементов словаря (или одномерного тензора) с использованием оператора раскрытия списка:

    summa := 0;
    dict := (1,2,3,4,5,);
    [ dict ] <-> { # Условие цикла, пока есть данные
        # Результат оператора распаковка словаря - первый элемент перемещается в item
        item, dict := ... dict; 
        summa += item; # Вычисление суммы всех элементов словаря
    };