Оператор WHILE
Оператор WHILE создает действие, реализующее рекурсивный цикл.
Синтаксис
WHILE expression [ORDER [DESC] orderExpr1, ..., orderExprN]
[NEW [alias =] className]
DO action
Описание
Оператор WHILE создает действие, реализующее рекурсивный цикл. Этот оператор может добавлять свои локальные параметры при задании условия. Эти параметры соответствуют перебираемым объектам и не являются параметрами создаваемого действия. Также в блоке NEW можно указать класс объекта, который будет создаваться для каждого набора объектов, удовлетворяющего условию. Созданный объект привязывается к локальному параметру с именем alias (или added по умолчанию), который может использоваться в основном действии.
Порядок перебора наборов объектов в операторе WHILE может быть задан блоком ORDER. Если в выражениях, задающих порядок, объявляется новый параметр (не встречавшийся ранее в операторе WHILE или в верхнем контексте), то при вычислении результирующего значения автоматически добавляется условие на не NULL всех этих выражений.
Параметры
-
expressionВыражение, задающее условие. В этом выражении можно обращаться как к уже объявленным параметрам, так и объявлять новые локальные параметры.
-
DESCКлючевое слово. Указывает на обратный порядок просмотра наборов объектов.
-
orderExpr1, ..., orderExprNСписок выражений, определяющих порядок, в котором будут перебираться наборы объектов. Для определения порядка сначала используется значение первого выражения, затем при равенстве используется значение второго и т.д. Если список не задан, то перебор происходит в произвольном порядке.
-
aliasИмя локального параметра, которое будет соответствовать создаваемому объекту. Простой идентификатор. Если не указан, параметр получает имя
added. -
classNameИмя класса создаваемого объекта. Задается идентификатором класса.
-
actionКонтекстно-зависимый оператор-действие, описывающий выполняемое действие.
Примеры
iterateDates (DATE dateFrom, DATE dateTo) {
LOCAL dateCur = DATE();
dateCur() <- dateFrom;
WHILE dateCur() <= dateTo DO {
MESSAGE 'I have a date ' + dateCur();
dateCur() <- sum(dateCur(), 1);
}
}