Перейти к основному содержимому
Версия: 7.0

Цикл (FOR)

Оператор цикла создает действие, которое перебирает все наборы объектов, для которых выполняется заданное условие, и для каждого такого набора объектов выполняет заданное действие (будем называть его основным). Также существует возможность задать альтернативное действие, которое выполняется, только если не было найдено ни одного набора объектов, удовлетворяющего условию. Само условие задается некоторым свойством. Будем говорить, что условие выполняется, если значение этого свойства не равно NULL.

Множество перебираемых наборов объектов фиксируется до начала цикла: условие вычисляется один раз, подходящие наборы объектов читаются, после чего основное действие выполняется по одному разу для каждого набора из этого множества. Изменения, сделанные основным действием, — в том числе изменения данных, на которых построено условие, — не влияют на перебираемое множество.

Если основное действие состоит из присваиваний, платформа может выполнять каждое из них сразу для всех наборов объектов, как одно изменение свойства над всем множеством, а не по одному разу для каждого набора. Она делает это, только если в основном действии нет операторов прерывания, следующей итерации, выхода, применения и отмены изменений, а присваивания не зависят друг от друга: ни одно из них не читает свойство, которое изменяет оно само или другое присваивание, и никакие два не изменяют одно и то же свойство. Результат тогда тот же, отличается только способ выполнения. Разработчик может запретить такое выполнение для всех или для части параметров цикла либо снять условие независимости.

По умолчанию наборы объектов перебираются в произвольном не гарантированном порядке. Разработчик может задать этот порядок явно, указав список свойств, используемых как ключи сортировки: наборы объектов сравниваются по значению первого свойства, при равенстве — по второму, и так далее. По умолчанию весь список используется по возрастанию. Разработчик может потребовать убывающего порядка, в этом случае он применяется ко всему списку.

Как и для других операций со множествами, условие должно быть таким, чтобы операция была корректной.

Внутри основного действия оператор прерывания выходит из данного цикла, оператор следующей итерации переходит к следующему набору объектов в том же множестве, а оператор выхода пробрасывается выше, выходя из окружающего вызова действия.

Добавление объекта​

В этом операторе также существует возможность для каждого итерируемого набора объектов создавать объект заданного конкретного пользовательского класса. Этот объект затем можно использовать в основном действии в качестве параметра.

Язык​

Синтаксис оператора цикла описывается оператором FOR.

Примеры​

name = DATA STRING[100] (Store);

testFor {
LOCAL sum = INTEGER ();
FOR iterate(i, 1, 100) DO {
sum() <- sum() (+) i;
}

FOR in(Sku s) DO {
MESSAGE 'Sku ' + id(s) + ' was selected';
}

FOR Store st IS Store DO { // пробегаем по всем объектам класса Store
FOR in(st, Sku s) DO { // пробегаем по всем Sku, для которых in задано
MESSAGE 'There is Sku ' + id(s) + ' in store ' + name(st);
}

}
}

newSku () {
NEW s = Sku {
id(s) <- 425;
name(s) <- 'New Sku';
}
}

copy (Sku old) {
NEW new = Sku {
id(new) <- id(old);
name(new) <- name(old);
}
}

createDetails (Order o) {
FOR in(Sku s) NEW d = OrderDetail DO {
order(d) <- o;
sku(d) <- s;
}
}