Цикл (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;
}
}