Оператор FOR
Оператор FOR создает действие, реализующее цикл.
Синтаксис
FOR expression [ORDER [DESC] orderExpr1, ..., orderExprN]
[TOP topExpr] [OFFSET offsetExpr]
[NOINLINE [(param1, ..., paramN)]] [INLINE]
[NEW [alias =] className]
DO action
[ELSE alternativeAction]
Возможен вариант, когда в операторе присутствует блок NEW, а условие не указывается (считается равным TRUE), в этом случае синтаксис выглядит следующим образом:
NEW [alias =] className
action
Описание
Оператор FOR создает действие, реализующее цикл. Этот оператор может добавлять свои локальные параметры при задании условия. Эти параметры соответствуют перебираемым объектам и не являются параметрами создаваемого действия. Также в блоке NEW можно указать класс объекта, который будет создаваться для каждого набора объектов, удовлетворяющего условию. Созданный объект привязывается к локальному параметру с именем alias (или added по умолчанию), который может использоваться в основном действии.
Порядок перебора наборов объектов в операторе FOR может быть задан блоком ORDER. Если в выражениях, задающих порядок, объявляется новый параметр (не встречавшийся ранее в операторе FOR или в верхнем контексте), то при вычислении результирующего значения автоматически добавляется условие на не NULL всех этих выражений.
Основное действие указывается после ключевого слова DO, альтернативное может быть указано после ключевого слова ELSE.
Если основное действие состоит из присваиваний, платформа, когда это возможно, выполняет их сразу для всех перебираемых наборов объектов, а не по одному разу для каждого набора (условия описаны в абстракции цикла). Блок NOINLINE запрещает это для всех или для перечисленных локальных параметров, а блок INLINE снимает условие независимости присваиваний друг от друга.
В случае когда в операторе присутствует блок NEW, а условие не указывается, для созданного объекта будет вызвано основное действие.
Параметры
-
expressionВыражение, задающее условие. В этом выражении можно обращаться как к уже объявленным параметрам, так и объявлять новые локальные параметры.
-
DESCКлючевое слово. Указывает на обратный порядок просмотра наборов объектов.
-
orderExpr1, ..., orderExprNСписок выражений, определяющих порядок, в котором будут перебираться наборы объектов. Для определения порядка сначала используется значение первого выражения, затем при равенстве используется значение второго и т.д. Если список не задан, то перебор происходит в произвольном порядке.
-
TOP topExprВ цикле будут участвовать только первые
nзаписей, гдеn- значение выраженияtopExpr. -
OFFSET offsetExprВ цикле будут участвовать только записи со смещением
m, гдеm- значение выраженияoffsetExpr. -
NOINLINEКлючевое слово. Основное действие выполняется по одному разу для каждого набора объектов, как записан цикл, а не его присваивания сразу для всех наборов объектов.
-
param1, ..., paramNЛокальные параметры, объявленные в условии или в выражениях
ORDER, к которым относитсяNOINLINE. Цикл выполняется по одному разу для каждой комбинации их значений, а внутри неё перебираются остальные параметры, и присваивания выполняются сразу для всех наборов там, где условия это допускают. ПриORDERсписок считается полным. ПриTOPилиOFFSETнеполный список не действует, а полный действует по-прежнему. -
INLINEКлючевое слово. Условие независимости присваиваний основного действия друг от друга не проверяется, поэтому они могут выполняться сразу для всех наборов объектов, даже когда зависят друг от друга, что может изменить результат по сравнению с выполнением по одному разу для каждого набора. Остальные условия сохраняются.
-
aliasИмя локального параметра, которое будет соответствовать создаваемому объекту. Простой идентификатор. Если не указан, параметр получает имя
added. -
classNameИмя класса создаваемого объекта. Задается идентификатором класса.
-
actionКонтекстно-зависимый оператор-действие, описывающий основное действие.
-
alternativeActionКонтекстно-зависимый оператор-действие, описывающий альтернативное действие. В качестве параметров нельзя использовать параметры, добавленные при задании условия / создании объекта.
Примеры
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) TOP 100 NEW d = OrderDetail DO {
order(d) <- o;
sku(d) <- s;
}
}