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