Язык @-формул в LotusDomino R 6.

Операторы выполнения операций


В таблице, приведенной ниже, перечислены все допустимые в @-формулах операторы в порядке убывания их приоритета. Горизонтальные линии отделяют группы операторов с разным приоритетом. Если в одном выражении встречаются операторы одного приоритета, они выполняются слева направо. Изменить порядок выполнения можно с помощью круглых скобок.

Оператор

Название, описание

Приоритет

Если операнды - списки

:=



Присваивание. В R 6  допустимы вложенные операторы присваивания

-

[]

Выделение элемента списка. Новый оператор в R 6

1

:

Объединение списков

2

-, +

Изменение знака

3

*

**

/

*/

Умножение

Умножение

Деление

Деление

4

Попарно

Все со всеми

Попарно

Все со всеми

+

*+

-

*-

Сложение, конкатенация

Сложение, конкатенация

Вычитание

Вычитание

5

Попарно

Все со всеми

Попарно

Все со всеми

=

*=

<>, !=, =!, ><

*<>

*<

*>

<=

*<=

>=

*>=

Равно

Равно

Не равно

Не равно

Меньше

Меньше

Больше

Больше

Меньше или равно

Меньше или равно

Больше или равно

Больше или равно

6

Попарно

Все со всеми

Попарно

Все со всеми

Попарно

Все со всеми

Попарно

Все со всеми

Попарно

Все со всеми

Попарно

Все со всеми

!

&

|

Логическое ОТРИЦАНИЕ

Логическое И

Логическое ИЛИ

7

В R 6 стали допустимы вложенные операторы присваивания. Например,

Categories := @UpperCase((Country := "Египет") + "\\" + Town := "Хургада");

@Prompt([Ok]; "Categories"; Categories); - выдаст ЕГИПЕТ\ХУРГАДА

@Prompt([Ok]; "Country"; Country); - выдаст Египет

@Prompt([Ok]; "Town"; Town); - выдаст Хургада

Если бы в первом операторе формулы не взять в скобки (Country := "Египет"), то значение переменной Country было бы Египет\Хургада. Более наглядно последовательность выполнения вложенных операторов видна из следующего примера:

A := 2;

B := 3;

C := 4;


D := 5;

E := @Text( A * B := C + D );

@Prompt([Ok]; "A"; @Text(A)); - выдаст 2

@Prompt([Ok]; "B"; @Text(B)); - выдаст 9, т.к. 4+5 = 9

@Prompt([Ok]; "C"; @Text(C)); - выдаст 4

@Prompt([Ok]; "D"; @Text(D)); - выдаст 5

@Prompt([Ok]; "E"; E); - выдаст 18, т.к. 2*9 = 18

В левой части от оператора присваивания как префикс перед переменной типа поля (но не временной переменной) могут стоять ключевые слова DEFAULT, ENVIRONMENT, или FIELD. Для вложенных операторов присваивания допустимо только ключевое слово FIELD.

FIELD Categories := @UpperCase(FIELD Country := "Египет" + "\\" + "Хургада");

Оператор двоеточие «:» используется для объединения двух значений одного типа данных в список. Каждый из операндов сам может быть списком. Результат содержит все элементы первого операнда, затем все элементы второго. При многократном использовании в одном выражении можно объединить в список несколько значений:

"Moscow" : "London" : "New York" : "Tokyo"

В R 6 появился новый оператор квадратные скобки «[]», который позволяет выделить N-й элемент списка по его индексу:

my_list := "Moscow" : "London" : "New York" : "Tokyo";

@Prompt([Ok]; "Информация"; my_list[2]) – выдаст London

В качестве индекса может выступать константа, переменная или выражение, имеющие числовое значение (десятичные числа округляются до ближайшего целого). Первый элемент списка имеет индекс – 1. При выходе значения индекса за границы слева и справа, возвращается сообщение об ошибке «Array index out of bounds» («Индекс массива выходит за границы»).

Оператор выделения элемента списка может применяться для любых типов данных, которые могут принимать значение списков (текст, числа, дата/время), даже если значение скалярно (т.е. не список). Для типов данных, которые не могут принимать значение списков (Rich text поля), допустимо использование только индекса 1. Bозвращаемое значение в этом случае равно текущему уже сохраненному значению Rich text поля без изменений.



Rem "поле my_date имеет тип Data/Time содержит значение 26.04.1964, и не допускает принятие множественных значений типа список «Allow multiple values»";

@Prompt([Ok]; "Информация"; @Text(my_date[1])); - выдаст 12.04.1964

Оператор выделения элемента списка не может быть использован в левой части оператора присваивания. Таким образом нельзя изменить значение списка присваиванием нового значения оператору выделения элемента списка (т.е. VariableName[1] := "New Value” – приведет к состоянию ошибки ). В правой части оператора присваивания оператор выделения элемента списка допустим.

my_list := "Moscow" : "London" : "New York" : "Tokyo";

my_list := my_list[3] : "Volgograd" : my_list[1];

@Prompt([Ok]; "Информация"; @Implode(my_list; "-")) – выдаст New York-Volgograd-Moscow

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

Операции (и операторы) со списками возможны двух типов:

Попарно (Pair-wise) - первый с первым, второй со вторым и т.д. Если один из списков короче, вместо недостающих элементов используется последний.

Все со всеми (Permuted) - каждый с каждым - перебираются все комбинации в следующем порядке: первый элемент первого списка со всеми элементами второго, затем второй элемент первого списка со всеми второго и т.д. Обозначение: перед обычным знаком операции вставляется символ «*».

При операциях сравнения списков в обоих случаях для получения положительного результата всей операции достаточно положительного результата в одной паре.

Пример. Сравнение двух списков на равенство и неравенство может привести к одинаковому результату!

"A":"B"  = "A":"C"  - Истина, т.к. "A" = "A"

"A":"B" != "A":"C"  - тоже Истина, т.к. "B" != "C"


Содержание раздела