Оператор JOIN
Оператор JOIN
- создание свойства, реализующего композицию.
Синтаксис
[JOIN] propertyId(expr1, ..., exprN)
[JOIN] "[" operator "]" (expr1, ..., exprN)
[JOIN] "[" expression "]" (expr1, ..., exprN)
Где "["
и "]"
- это обычные квадратные скобки.
Описание
Оператор JOIN
создает свойство, реализующее композицию свойств. Главное свойство может быть задано с помощью трех различных вариантов:
- идентификатором существующего свойства
- контексто-независимым оператором-свойством, заключенным в квадратные скобки.
- выражением, заключенным в квадратные скобки.
Два последних варианта позволяют в качестве главного свойства использовать свойство без имени, создаваемое прямо по месту использования. Это может в определенных случаях сделать код более лаконичным и позволяет не объявлять явно с помощью инструкции =
промежуточное свойство, которое в дальнейшем нигде не будет использоваться. Оператор или выражение, заключенные в квадратные скобки со знаком равенства, при необходимости могут использовать внешние параметры. При определении параметров создаваемого "анонимного" свойства действуют те же правила, что и при создании свойства в инструкции =
, в случае, когда параметры не заданы явно.
Формально оператор JOIN
отвечает и за конструкции вида propertyID(a, b)
, то есть просто существующее свойство с переданными ему параметрами. В таких случаях, когда это возможно, оператор JOIN
не будет создавать новое анонимное свойство, а буд ет возвращать свойство с идентификатором propertyID
.
Параметры
-
propertyId
-
expr1, ..., exprN
Список выражений, задающих аргументы главного свойства. Количество выражений должно быть равно количеству параметров главного свойства.
-
operator
Контекстно-независимый оператор-свойство, который используется для создания главного свойства.
-
expression
Выражение, которое используется для задания главного свойства. Не может быть одиночным параметром.
Примеры
f = DATA INTEGER (INTEGER, INTEGER, INTEGER);
g = DATA INTEGER (INTEGER, INTEGER);
h = DATA INTEGER (INTEGER, INTEGER);
c(a, b) = f(g(a, b), h(b, 3), a);
count = DATA BPSTRING[255] (INTEGER);
name = DATA BPSTRING[255] (INTEGER);
formatted(INTEGER a, INTEGER b) = [FORMULA BPSTRING[255] ' CAST($1 AS TEXT) || \' / \' || CAST($2 AS TEXT)'](count(a), name(b));
Иногда удобно задавать главное свойство с помощью выражения, чтобы упростить исходный код и сделать его более понятным.
CLASS Triangle;
cathetus1 = DATA DOUBLE(Triangle);
cathetus2 = DATA DOUBLE(Triangle);
hypotenuseSq(triangle) = cathetus1(triangle)*cathetus1(triangle) + cathetus2(triangle)*cathetus2(triangle);
// аналогичное свойство, заданное с помощью композиции
hypotenuseSq2(triangle) = [ x*x + y*y](cathetus1(triangle), cathetus2(triangle));