Перейти к содержанию

Конструкции

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

Входы

Вход используется для получения доступа к данным, пришедшим в блок.

Получение входа по идентификатору

<[Вход | Input]>{[id | идентификатор] = <идентификатор>}
  • Идентификатор- идентификатор входа.

Получение входа по наименованию

<[Вход | Input]>{[name | имя] = <наименование>}
  • Наименование - строковое наименование входа.

Несмотря на то, что можно создавать входы с одинаковыми наименованиями, не рекомендуется этого делать, во избежание некорректного расчета.

Сокращенная нотация

Получение входа по его наименованию или идентификатору.

<Идентификатор/Наименование>

Поиск будет осуществляться как по идентификатору, так и по наименованию. Если имеется два входа с одинаковыми наименованиями/идентификаторами, то будет взят первый из них.

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

Актуально и обратное - если в данных приходит массив, а в настройках входа массив не указан, то блок не будет считать входные данные массивом.

Получение значений входа

Для объектов и рядов есть возможность получить значение выбранного элемента.

Параметры получения значения задаются в фигурных скобках ({}) после определения входа.

Если была использована не сокращенная нотация входа, то для получения значений необходимо добавить после предыдущих скобок:

<[Вход | Input]>{[id | идентификатор] = <идентификатор>}{<параметры>}
В описании примеров ниже, первые фигурные скобки будут опущены для упрощения записи

Формат записи

<ВХОД>{<ключ> : <значение>, <ключ> : <значение>,...}
  • ключ - наименование атрибута или ключа объекта/ряда,
  • значение - значение выбранного ключа.

Особенности реализации

  • Вход должен быть массивом (т.к. происходит выборка элементов из массива);
  • Доступно только для объектов и рядов; для всех остальных типов данных конструкция "фигурные скобки" у входа будет вызывать ошибку;
  • Если параметры недостаточны (подходит несколько элементов для выбора) - блок выдаст ошибку.

Формат выхода

  • Для объектов - берется значение атрибута vl, если его нет, то в качестве значения берется пустой элемент;
  • Для рядов - словарь формата {<ключ>: <значение>};
  • Для получения конкретного значения ряда в параметрах требуется указать ключ ряда (ключ поля fkey) и значение отдельного элемента, в качестве параметров <ключ>=<значение> соответственно.

Получение целых объектов и рядов

Если вход является массивом, то для получения объектов или рядов можно использовать следующие Методы:

  • Для выбора нескольких элементов из входа метод where

    .[ where | где ](<Переменная> => <Условие>) → <Массив>
    

  • Для выбора единичного элемента из входа метод first:

    .[ first | первый ](<Переменная> => <Условие>) → [ <Объект> | <Ряд> ]
    

Обратите внимание, что при получении элементов из входа, в Условие можно использовать не только атрибуты, но и первичные ключи, к примеру:

[{"pkey": {"id": 1},...}, {"pkey": {"id": 2},...}].first(i => i['id'] == 2)
Извлечет из входа объект с первичным ключом id = 2.

Кроме того, т.к. вход является массивом, то можно получить конкретный элемент массива по его индексу:

<ВХОД-МАССИВ>[<индекс>]

Константы

Получение глобальных констант. Синтаксис аналогичен получению входов.

Получение константы по идентификатору

<[Константа | Const]>{[id | идентификатор] = <идентификатор_константы>}
  • Идентификатор_константы- идентификатор константы.

Получение константы по наименованию

<[Константа | Const]>{[name | имя] = <наименование_константы>}
  • Наименование_константы - строковое наименование константы.

Сокращенная нотация

Получение константы по его наименованию или идентификатору.

<Идентификатор_константы/Наименование_константы>

Условие

[ if | если ] <Условие> [ then | тогда ] <Правда> (Не обязательно [ else | иначе ] <Ложь>)
Условие представляет собой выбор одного из двух элементов: при выполнении условия и при его не выполнении. Условие, Правда и Ложь могут быть выражениями, которые будут рассчитаны при необходимости (условие - будет рассчитано всегда, правда и ложь - в зависимости от выполнения условия).

В Условие используются базовые операции, возвращающий Логический тип данных.

Часть [ else | иначе ] допустимо не писать, однако, если условие не выполнено, то вернется Пустой элемент.

Актуально для блока "Правила"

В элементы Правда и Ложь, кроме одного выражения, так же можно добавить функцию msg(). Несмотря на то, что эта функция возвращает пустой элемент, здесь он будет проигнорирован.

Формально, в элементах Правда и Ложь допустимо несколько выражений, однако в качестве результата выполнения вернется только первое не пустое выражение.

Переменная

[ var| имя ] <Переменная> = ( <Выражение> )

Конструкция VAR позволяет записывать какое-угодно выражение в переменную, после чего эту переменную можно использовать в других частях выражения.

Пример

var items = ({1: 'a', 2: 'b', 3: 'c'}.values())

Результат:    
items → ['a', 'b', 'c']
items[0] → 'a'
  • Конструкция VAR заменила собой устаревшею конструкцию WITH
  • VAR всегда указывается в самом начале выражения и вычисляется перед расчетом выражения.
  • Можно использовать несколько конструкций VAR, при этом нижние могут включать в себя переменные из верхних:
var elements = ([1, 2, 3, 4, 5])
var number = (100 - 77)
var numberInElement = (elements.contains(number))

numberInElement -> Ложь

Цикл for

[ for | для ] <Переменная> [ in | в ] <Массив> ( <Выражение> )

Цикл for позволяет производить вычисления над каждым элементом из массива. Результатом цикла будет массив выражений, выполненных внутри цикла.

Пример
for element in [1, 2, 3] (element ** 2) → [1, 4, 9]

Вложенные циклы

Можно располагать несколько циклов вложенными друг в друга.

for element in [1, 2, 3] (
    for element2 in [10, 20] (
        element * element2
    )
)

 -> [[10, 20], [20, 40], [30, 60]]

Циклы и правила

Актуально для блока "Правила"

Можно располагать правила внутри циклов с разделением через ; (точку с запятой):

[ for | для ] <Переменная> [ in | в ] <Массив> ( 
    [ if | если ] <Условие> [ then | тогда ] <Правда>;
    [ if | если ] <Условие> [ then | тогда ] <Правда>;
    [ if | если ] <Условие> [ then | тогда ] <Правда>
)

Если расчет стоит до первого сработавшего правила, то как только правило сработает в цикле, цикл прерывается и расчет завершается.