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

Выражения

Выражение - это комбинация операторов-свойств и параметров. При вычислении выражения последовательно в порядке приоритетов выполняются все операторы.

Значением выражения будем называть возвращаемое значение свойства, получившегося в результате выполнения операторов, либо значение параметра, если выражение являлось одиночным параметром.

Выражение можно описать набором следующих рекурсивных правил:

ПравилоОписание
expression := parameter | constant | prefixOperatorОдиночный параметр, константа или префиксный неарифметический оператор
expression := prefixArithmOp expressionУнарный префиксный арифметический оператор, с переданным ему в качестве операнда выражением
expression := expression postfixOpУнарный постфиксный оператор, с переданным ему в качестве операнда выражением
expression := expression binaryOp expressionБинарный оператор с переданными ему в качестве операндов выражениями
expression := ( expression )Выражение в круглых скобках

В состав выражения не могут входить контекстно-независимые операторы-свойства.

Использование действий внутри выражений

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

Такой вызов эквивалентен последовательному выполнению:

  • создание локального свойства с сигнатурой результата действия;
  • вызов действия с записью результата в это локальное свойство;
  • подстановка этого локального свойства в выражение.

Использование вызовов действий в выражениях допустимо только внутри тела действия.

Примеры

CLASS Team;

wins(team) = DATA INTEGER(Team);
ties(team) = DATA INTEGER(Team);

// Количество очков, полученное командой за сыгранные матчи
points(Team team) = wins(team) * 3 + ties(team);
// В данном случае выражение записано справа от знака равенства. Оно определяет новое свойство points.
// При вычислении выражения сначала выполнятся два оператора JOIN: wins(team) и ties(team), подставив
// параметр team в свойства wins и ties. Затем выполнится оператор умножения, который построит свойство,
// возвращающее число, равное произведению возвращаемого значения wins(team) и числа 3. Затем выполнится
// оператор сложения, который создаст свойство, суммирующее возвращаемые значения (wins(team) * 3) и ties(team).
// Получившееся свойство и будет являться результатом выполнения выражения.

CLASS Game;
CLASS BonusGame : Game;

// Количество очков за игру. Если игра бонусная, то 3, иначе 2.
gamePoints(Game game) = 2 (+) (1 IF game IS BonusGame);
// В данном примере порядок выполнения операторов будет такой: IS, IF, (+)

CLASS Item;
price(Item i) = DATA INTEGER (Item);
label(Item i) = DATA STRING[100] (Item);

priceBucket (INTEGER p) {
IF p > 1000 THEN RETURN 'high';
IF p > 100 THEN RETURN 'mid';
RETURN 'low';
}

// вызов действия priceBucket внутри выражения в теле другого действия
labelItem (Item i) {
label(i) <- 'Bucket: ' + priceBucket(price(i));
}