Описание Expression Graph Scripting 2019

Материал из Integra-S Wiki
Версия от 10:44, 4 августа 2021; Ipe (обсуждение | вклад) (Операторы)
Перейти к: навигация, поиск

Классификация

Язык EGS - компилируемый статически типизированный (с выведением типов) язык программирования для платформы .net, на данный момент сочетающий в себе только элементы функционального и императивного программирования. Язык EGS испытал влияние следующих широко известных языков: CoffeeScript, Lua, C# и SQL.

Ключевые слова

Следующие ключевые слова являются полностью зарезервированными:

 true, false, on, off, yes, no, null, nil, it, new, try, let, if, switch, use, with, print, from, typeof, async, await, once, const, assert, eval, error, last_error, check.

Следующие ключевые слова являются частично зарезервированными, т.е. используются только в контексте соответствующих выражений:

 not, mod, and, or, like, is, as, in, then, else, do, isnt, empty, to, at, first, last, single, count, min, max, average, sum, select, many, cast, of, type, any, all, reverse, order, by, where, while, skip, take, asc, desc, array, list, concat, intersect, union, except, now, end, bind, distinct, group, when, typedef.

Комментарии

Поддерживаются однострочные комментарии начинающиеся с символа #

 # only single line comments supported 

Идентификаторы

Идентификатор состоит из буквы или знака подчеркивания, за которым следует любое количество букв, цифр или символов подчеркивания. Чтобы ссылаться на идентификатор с тем же написанием, что и ключевое слово, идентификатор должен иметь префикс с одним символом @.

Некоторые примеры идентификаторов:

 x, Hello, m_1, @true, @String 

Литералы

Язык выражений поддерживает следующие типы литералов:

  1. Целочисленные литералы. Например: 0, 123, 10000:
    1. Целочисленный литерал состоит из последовательности цифр.
    2. Тип целочисленного литерала - это первый из типов Int32, UInt32, Int64 или UInt64, который может представлять заданное значение.
    3. Целочисленный литерал неявно преобразуется в любой другой числовой тип, если число находится в диапазоне этого типа.
  2. Литералы с плавающей точкой(тип double). Например: 1.0, 2.25, 10000.0, 1e0, 1e10, 1.2345E-4:
    1. Литерал с плавающей точкой состоит из целой части, за которой следуют дробная часть и / или экспонента.
    2. Целая часть представляет собой последовательность из одной или нескольких цифр.
    3. Дробная часть представляет собой десятичную точку, за которой следуют одна или несколько цифр.
    4. Показателем является буква e или E, за которой следует необязательный знак + или -, за которым следуют одна или несколько цифр.
    5. Литерал неявно преобразуется в любой другой числовой тип с плавающей точкой, если находится в диапазоне этого типа.
  3. Строковые литералы(тип string). Например: "hello", `hello`, "", """quoted""", "'":
    1. Строковый литерал состоит из нуля или более символов, заключенных в двойные кавычки.
    2. Внутри строкового литерала двойная кавычка записывается как две последовательные двойные кавычки.
  4. Символьные литералы(тип char). Например: 'A', '1', ', '"':
    1. Символьный литерал состоит из одного символа, заключенного в одинарные кавычки.
    2. Внутри символьного литерала одиночная кавычка записывается как две последовательные одиночные кавычки.

Константы

  1. Предопределенные константы true, yes, on и false, no, off обозначают два значения типа bool соответственно.
  2. Предопределенные константы null и nil обозначают нулевую ссылку.
  3. Нулевая константа имеет тип object, но также неявно преобразуется в любой ссылочный тип.

Типы

Встроенные типы

  1. Язык выражения определяет следующие примитивные типы :
    1. void - см. System.Void.
    2. string - см. System.String.
    3. char - см. System.Char.
    4. bool - см. System.Boolean.
    5. sbyte - см. System.SByte.
    6. byte - см. System.Byte.
    7. short - см. System.Int16.
    8. ushort - см. System.UInt16.
    9. int - см. System.Int32.
    10. uint - см. System.UInt32.
    11. long - см. System.Int64.
    12. ulong - см. System.UInt64.
    13. float - см. System.Single.
    14. double - см. System.Double.
    15. decimal - см. System.Decimal.
    16. object - см. System.Object.
    17. function - см. System.Delegate.
    18. Enum - см. System.Enum.
    19. Guid - см. System.Guid.
    20. DateTime - см. System.DateTime.
    21. TimeSpan - см. System.TimeSpan.
    22. Array - см. System.Array.
    23. Tuple - см. System.Tuple.
    24. Type - см. System.Type.
  2. Так же доступны следующие специфические типы из пространства имен acuario2:
    1. Status - см. acuario2.types.Status.
    2. Priority - см. acuario2.types.Priority.
    3. Param - см. acuario2.types.Param.
    4. AbstractObject - см. acuario2.types.AbstractObject.
    5. Pin - см. acuario2.types.Pin.
    6. Object - см. acuario2.types.Object.
    7. Event - см. acuario2.types.Event.
    8. GraphObject - см. acuario2.types.GraphObject.
    9. Item - см. acuario2.types.Item.
    10. Link - см. acuario2.types.Link.
    11. Graph - см. acuario2.client.Graph.
  3. На обнуляемую форму типа указывает вопросительный знак после имени типа. Например, bool? Обозначает обнуляемую форму bool.

Дополнительные типы

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

  1. use NameSpace.TypeName [as Alias] [from AssemblyName|"AssemblyPath"]
  2. use NameSpace.TypeName(GenericTypeName1, ...) as Alias [from AssemblyName|"AssemblyPath"]
  3. use (StringExpression) [as Alias] [from AssemblyName|"AssemblyPath"]
  4. use new {...} as Alias
  5. use typedef `...` as Alias
Где:
[...] - квадратные скобки выделяют необязательный элемент;
| - символ разделяющий альтернативные элементы;
, ... - означает повторение предыдущего элемента 1 или более раз;
new {...} - объявление нового типа, см. оператор new;
NameSpace - полное пространство имен типа;
TypeName - имя типа;
Alias - псевдоним типа;
AssemblyName- имя сборки содержащей тип;
AssemblyPath- полный путь к сборке содержащей тип;
GenericTypeName1 - первый аргумент общего типа;
StringExpression - выражение возвращающее строку и выполняемое на этапе компиляции, см. const;
typedef `...` - объявление нового типа с сигнатурой совместимой с Dynamic Typedef, см. TypeDef 2017, вещественные типы параметров при этом приводятся к обнуляемой форме (т.е. например: int к int?).

Например:

use System.Random
use acuario2.types.SpatialObject from acuario2.types
use acuario2.types.SpatialObject as SObj from acuario2.types
use System.Web.Script.Serialization.JavaScriptSerializer from "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Web.Extensions.dll" 
use System.Collections.Generic.Dictionary(string, object) as Dictionary
use ("System.Random") as Random
use new { a = 0, b = false, c = new [0], d = new { t = "" } } as JSON
use typedef 
`
    <root>
        <param name="url">http://localhost:1986/axis2/services/Iv7Server</param>
        <param name="max_zoom_distance" type="real">1500</param>
        <param name="max_zoom_limit_factor" type="real">1</param>
    </root>
` as Settings

Оператор use можно использовать только на верхнем уровне скрипта, т.е. не допускается его использование внутри блоков кода и функций.

Преобразование типов

Следующие преобразования неявно выполняются языком:

  1. Из нулевого литерала до любого ссылочного типа или типа, допускающего значение null.
  2. Из целочисленного литерала до целочисленного типа или реального типа, если номер находится в диапазоне этого типа.
  3. Из реального литерала до реального типа, если номер находится в диапазоне этого типа.
  4. Из строкового литерала до типа перечисления, если строковый литерал содержит имя члена этого типа перечисления.
  5. Из строкового литерала до Guid, если строковый литерал конвертируется в Guid.
  6. Из исходного типа, совместимого с целевым типом в соответствии с методом Type.IsAssignableFrom.
  7. Из типа значения, не допускающего значения null, до формы, допускающей значение null для этого типа значения.
  8. Из числового типа к другому числовому типу с большим диапазоном.
  9. Из любого типа к типу object.

Язык допускает явные преобразования с использованием следующего синтаксиса:

  1. TypeName(Expression).
  2. TypeName?(Expression).
  3. TypeName[](Expression).
Где:
? - указывает на обнуляемую форму типа
[] - указывает на массив типа
Expression - какое либо выражение преобразуемое к типу TypeName

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

  1. Между двумя типами при условии, что Type.IsAssignableFrom истинно в одном или обоих направлениях.
  2. Между двумя типами обеспечивается один или оба типа интерфейсов.
  3. Между нулевыми и ненулевыми формами любого типа значения.
  4. Между любыми двумя примитивными типами или типами перечисления.
  5. Из любого типа в стоку при помощи метода Object.ToString.
  6. Из строки в тип имеющий статический метод Parse(string).
  7. Из любого "нового" типа языка EGS (см. оператор new {...}) в строку содержащую его JSON представление.
  8. Из строки содержащей JSON в соответствующий "новый" типа языка EGS.
  9. Так же язык допускает явные преобразования при помощи оператора as из C# с использованием аналогичного синтаксиса: Expression as TypeName.

Операторы

Доступ к экземпляру поля или экземпляру
Доступ к любому общему полю или свойству.
x.m
Так же возможен безопасный доступ к полю.
x?.m
В случае нулевого экземпляра возвращается значение по умолчанию типа поля.
Так же возможен как безопасный так и обычный доступ к полю имя которого рассчитывается на этапе компиляции, см. оператор const.
const m = "m" 
x.(m)
x?.(m)
Вызов метода экземпляра
Метод должен быть общедоступным и должен быть объявлен в доступном виде.
x.m(…)
Так же возможен безопасный вызов метода экземпляра.
x?.m?()
в случае нулевого экземпляра возвращается значение по умолчанию типа результата метода.
Доступ к массиву или индексатору
Многомерные массивы не поддерживаются.
x[…]
Так же возможен безопасный доступ к массиву или индексатору.
x?[...]
в случае нулевого экземпляра возвращается значение по умолчанию типа индексатора.
Статический доступ к свойствам
Доступ к любому общему полю или свойству.
T.m
Вызов статического метода
Метод должен быть общедоступным и должен быть объявлен в доступном виде.
T.m(…)
Явное преобразование или вызов конструктора
Обратите внимание, что new не требуется перед вызовом конструктора.

T(…)
T?(…)
T[](…)
Текущий экземпляр
В контексте, где члены текущего объекта неявно входят в область видимости, он используется для обращения к самому объекту целиком.
it
Отрицание
Поддерживаются следующие типы: int, long, decimal, float и double.
-x
Логическое отрицание
Операнд должен быть типа bool.
!x
not x
Умножение
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
x * y
Деление
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
x / y
Остаток
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
x % y
x mod y
Сложение или конкатенация строк
Выполняет конкатенацию строк, если любой из операндов имеет тип string. В противном случае выполняется сложение для поддерживаемых типов int, uint, long, ulong, decimal, float и double, DateTime и TimeSpan.
x + y
Вычитание
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double, DateTime и TimeSpan.
x – y
Конкатенация строк
Операнды могут быть любого типа.
x..y
Равенство
Поддерживается для ссылочных типов и примитивных типов.
x == y
x is y
Неравенство
Поддерживается для ссылочных типов и примитивных типов.
x != y
x <> y
x isnt y
x is not y
Меньше
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
x < y
Больше
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
x > y
Меньше или равно
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
x <= y
Больше или равно
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
x >= y
Логическое И
Операнды должны быть типа bool.
x && y
x and y
Логическое ИЛИ
Операнды должны быть типа bool.
x || y
x or y
Множественное сравнение
Операции сравнения, такие как ==, !=, <>, <, >, <=, >=, можно применять к операндам по цепочке.
Например:
x1 < x < x2
Эквивалентно следующему:
(x1 < x) and (x < x2)

Оператор ?? (null-coalescing) Возвращает x если оно не равно null, иначе возвращает y.

x ?? y эквивалентно if x isnt null then x else y Для переменных обнуляемых вещественных типов (например: int?), оператор возвращает необнуляемое значение x если само x не равно null, иначе возвращает y.

Если x является массивом, то

x ?? empty возвращает x, если оно не равно нулю, иначе возвращает пустой массив соответствующего типа. Оператор ??? (empty-coalescing) Возвращает x если оно является коллекцией, не равно null и не пусто, иначе возвращает y.

x ??? y эквивалентно if x isnt empty then x else y Проверка типа Проверяет является ли x экземпляром типа T, либо конвертируемым в тип T при помощи оператора is.

x is T x isnt T x is not T Проверка наличия значения Проверяет наличие значение выражения x обнуляемого или ссылочного типа.

x is null x isnt null x is not null Преобразование типа Преобразовывает x в тип T при помощи оператора as из языка C# .

x as T Проверка наличия элемента в коллекции Проверяет наличие элемента x в коллекции y. Коллекция должна поддерживать интерфейс IEnumerable<T> или IDictionary<K,V>. В случае если коллекция является словарем проверяется наличие ключа. В случае если первый операнд является строкой, а второй типом перечислимого значения проверяется наличие такого значения в типе.

x in y x is in y x isnt in y x is not in y "EnumItem" in EnumType Проверка пустоты коллекции Проверяет коллекцию x на существование и наличие в ней элементов.

x is empty x isnt empty x is not empty Проверка подобия Проверяет соответствие x шаблону y при помощи оператора Like из языка Visual Basic .

x like y x is like y x isnt like y x is not like y Шаблон оператора поддерживает следующие контрольные символы: ? - Любой одиночный символ

  • - Ноль или более символов
  1. - Любая цифра от 0 до 9

[ charlist ] - Любой одиночный символ в charlist [! charlist ] - Любой одиночный символ, не включенный в charlist Создание массивов Создает массив из элементов x1, x2, ..., xn. Тип массива вычисляется из типов его элементов. Если элементы имеют разный тип, то типом массива будет object[].

new [ x1, x2, ..., xn ] Для создания типизированного но не заполненного массива любой длинны можно воспользоваться обычным вызовом конструктора.

string[](0) int[](10) Создание новых классов и их экземпляров Создает новый тип со свойствами x, y и т.д. и экземпляр этого типа. Свойствам экземпляра присваиваются начальные значения X, Y, и т.д. При регистрации нового типа оператором use константные значения из X, Y, и т.д. становятся значениями свойств по умолчанию.

new { x = X, y = Y, ... } Создание наборов значений Создает набор из элементов x1, x2, ..., xn. Набор соответствует типу Tuple платформы .net и таким образом его элементы могут иметь разный тип.

new ( x1, x2, ..., xn ) Присвоение Присваивает переменной, свойству или индексатору x значение выражения X и возвращает это значение.

x = X y.x = X y[x] = X Обработка исключений Выполняет выражения x1,..., xn, в случае удачи возвращает xn, а в случае ошибки выполняет выражения y1,..., yn и возвращает yn. xn и yn должны иметь конвертируемые типы. При отсутствии оператора else, в случае ошибки возвращается значение по умолчанию типа выражения xn.

try x1; ...; xn else y1; ...; yn try x1; ...; xn else y1; ...; yn try x else y try x try x1; ...; xn Глобальная переменная last_error (типа System.Excetpion) содержит ссылку на последнюю произосшедшую ошибку. Переменная доступна в любом месте кода.

Установка текущего экземпляра Устанавливает в качестве оператора it результат x и выполняет с ним блок операций y1,..., yn

with x do y1; ...; yn with x do y1; ...; yn with x do y Например:

x.p1 = y1; x.p2 = y2; x.p3 = y3

Эквивалентно следующему: with x do p1 = y1; p2 = y2; p3 = y3

Члены объекта it имеют меньший приоритет нежели параметры скрипта, переданные ему при запуске и переменные объявленные во время исполнения скрипта видимые в текущем блоке кода. Обращаться к членам it перекрытым параметрами и переменными можно следующим образом: let p2 = 1 with x do

 p1 = y1
 it.p2 = y2

end Объявление переменных Объявляет переменную x типа выражения справа от = и присваивает ей результат этого выражения.

let x = 0 let x = false let x = X let x = T() let x = null as T Объявленная переменная видима во всем блоке, в котором она объявлена, начиная с места объявления. Возможно повторное объявление переменных с тем же именем в том же блоке.

Объявление набора переменных Объявляет переменные с именами указанными в скобках и присваивает им соответствующие их месту элементы набора справа от знака равенства.

let (x, y) = new (1, true) let (x, y) = new (1, 2, 3) let (, x, y) = new (1, 2, 3) # элементы можно пропускать let (x, y) = new (y, x) # можно использовать для обмена значениями Объявление переменных сохраняющих значение между вызовами Так же как и предыдущее, объявляет переменную x типа выражения справа от = и присваивает ей результат этого выражения, но делает это только при первом выполнении скрипта после компиляции. При последующих выполнениях переменная содержит тоже значение, однако может быть изменена при помощи присвоения.

once ticks = Environment.TickCount # присвоит при первом запуске и сохранит значение при последующих Обращение к таким переменным потокобезопасно.

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

const x = 2 const xx = x * x Следует помнить, что в отличии от других языков, EGS не поддерживает констант времени исполнения, выражения после const вычисляются на этапе компиляции, и таким образом ключевое слово const (равно как и use) являются директивами компилятора языка.

Объявление функций Объявляет функцию x с аргументами p1,..., pn заданных типов. Тип результата вычисляется по типу последнего выражения в ее теле.

let f(p1 as T1, ..., pn as Tn) = x1; ...; xn let f(p1 as T1, ..., pn as Tn) = x1; ...; xn let f() = x

f(p1, ..., pn) f() Параметры такой функции перекрывают внутри блока кода функции возможные имена внешних параметров скрипта и переменных объявленных ранее.

Альтернативный синтаксис позволяет создавать функции с именованными параметрами имеющими значения по умолчанию.

let f{p1 = X1, ..., pn = Xn} = x1; ...; xn

f{p1 = X1, ..., pn = Xn} f{p1 = X1} Функция с именованными параметрами, по сути, представляет собой обычную функцию с одним параметром установленным в качестве текущего экземпляра it. Следовательно к именованным параметрам можно обращаться так же через it, что может быть необходимо так, как внешние параметры скрипта и переменные объявленных ранее перекрывают доступ к членам it.

Так же возможно расширение функционала оператора is при помощи объявления предикатов с одним или двумя параметрами.

let even(x as int) = x % 2 is 0 if even(x) then ... if x is even then ...

let square(x as int, y as int) = x is y * y if square(x, y) then ... if x is square y then ... Объявление обобщенных функций Обобщенные функции объявляются так же как обычные, но без указания типов аргументов. Для определения типов аргументов, компиляция обобщенной функции откладывается то того момента в коде, когда она реально будет вызвана. Повторный вызов функции с отличными типами аргументов вызывает компиляцию еще одного ее варианта. Таким образом обобщенные функции похожи на макросы в других языках и компилируются в контексте вызова, а не определения.

let f(p1, ..., pn) = x1; ...; xn let f(p1, ..., pn) = x1; ...; xn

f(p1, ..., pn) Параметры обобщенной функции перекрывают внутри блока кода функции возможные имена внешних параметров скрипта и переменных объявленных ранее. Из-за отложенной компиляции в обобщенной функции видны не только определения сделанные раньше нее (как для обычных функций), но и те которые были сделаны вплоть первого вызова этой обобщенной функции с данным набором типов аргументов. Таким образом для обобщенных функций возможен взаимный рекурсивный вызов.

Условный оператор В случае выполнения условия x выполняет выражения x1,..., xn, иначе в случае выполнения условия y выполняет выражения y1,..., yn, иначе выполняет выражения z1,..., zn. В случае отсутствия последнего оператора else возвращает значение по умолчанию типа результата предыдущей условной ветки. Если результаты веток оператора не возможно привести к общему типу, то ко всем веткам автоматически добавляется результат по умолчанию void().

if x then x1; ...; xn else if y then y1; ...; yn else z1; ...; zn if x then x1; ...; xn else if y then y1; ...; yn else z1; ...; zn if x then x1 else y1 if x then x1 Если условием является простая проверка типа оператором is, то после имени типа можно указать имя переменной, которая в случае успеха проверки будет содержать значение приведенное к нужному типу например:

if x is Item i then print i.." is item" if x is Link l then print l.." is link" Оператор множественного выбора В случае выполнения условия x is x1 выполняет выражение или блок y1, иначе в случае выполнения условия x is xN выполняет выражение или блок yN, иначе выполняет выражение или блок z. В случае отсутствия последнего else возвращает значение по умолчанию типа результата предыдущей условной ветки. Если результаты веток оператора не возможно привести к общему типу, то ко всем веткам автоматически добавляется результат по умолчанию void().

 switch x
   when x1 then y1
   ...
   when xN then yN
   else z

В качестве вариантов для выбора можно использовать любые конструкции языка, которые доступны оператору is, например:

 switch x
   when in new [1,2,3] then y1
   when in new [4,5,6] then y2
   ...
   else z
 switch x
   when like "begin*" then y1
   when like "*end"   then y2
   ...
   else z
 switch x
   when Item then x.." is item" 
   when Link then x.." is link" 
   when Pin  then x.." is pin" 
   else x.." is unknown" 
 switch x
   when Item i then i.." is item" 
   when Link l then l.." is link" 
   when Pin  p then p.." is pin" 
   else             x.." is unknown" 
 let even(x) = x % 2 is 0
 let odd(x)  = x isnt even
 switch x
   when even then x.." is even" 
   when odd  then x.." is odd" 

Тип выражения Заменяет выражение константой содержащей его тип.

typeof x typeof x.a Асинхронное выполнение Выполняет выражение следующее после ключевого слова async асинхронно т.е. в другом потоке.

 let f(x as T) = ...
 async f(x)
 f(x)

Ожидание асинхронное результата Ожидает выполнения асинхронного выражения и возвращает его значение.

 let f(x as T) = ...
 await async f(x)

Печать Печатает в отладочный поток значение выражения x. Печатает в отладочный поток значения выражений x1,..., xn через пробел.

print x print(x) print(x1, ..., xn) Ошибка времени исполнения Вызывает исключение времени исполнения с текстом msg.

error msg error(msg) Проверка условия во времени компиляции Проверяет условие x во время компиляции, и в случае false вызывает ошибку компиляции со стандартным текстом (если специфический текст не указан вторым параметром).

assert x assert(x) assert(x, msg) Выполнение выражения во времени компиляции Выполняет выражение во время компиляции и заменяет его на результат.

eval x Помещение выражения в рамки Выражение должно состоять из одного или двух условий сравнения на <, <=, >, >= или !=, константных операндов и одного неконстантного операнда. Если выражение выполняется, то возвращается неконстантный операнд, иначе возвращается тот операнд который первым привел к невыполнению выражения, либо выражение после else, если указанно.

check x > 0 check 0 <= x <= 1 check (0 <= x/y <= 1) check 0 < x < 1 else -1 Диапазон Создает коллекцию чисел типа int начиная с x и до y

from x to y Редактировать эту секцию Операции над перечисляемыми типами Поддерживаются следующие монадические операции над перечисляемыми типами:

of type Фильтрует элементы IEnumerable на основе указанного типа.

from seq of type TypeName cast to Преобразует элементы IEnumerable в указанный тип.

from seq cast to TypeName select Проецирует каждый элемент последовательности в новую форму.

from seq select Selector select many Проецирует каждый элемент последовательности в IEnumerable и выравнивает полученные последовательности в одну последовательность.

from seq select many Selector where Фильтрует последовательность значений на основе предиката.

from seq where Predicate any Определяет, удовлетворяет ли какой-либо элемент последовательности условию.

from seq any Predicate

all Определяет, удовлетворяют ли все элементы последовательности условию.

from seq all Predicate count Возвращает количество элементов в последовательности. Возвращает число, которое представляет, сколько элементов в указанной последовательности удовлетворяют условию.

from seq count all from seq count Predicate min Вызывает функцию преобразования для каждого элемента общей последовательности и возвращает минимальное результирующее значение.

from seq min max Вызывает функцию преобразования для каждого элемента общей последовательности и возвращает максимальное результирующее значение.

from seq max sum Вычисляет сумму последовательности значений, которая получается при вызове функции преобразования для каждого элемента входной последовательности.

from seq sum average Вычисляет среднее значение последовательности значений, которое получается при вызове функции преобразования для каждого элемента входной последовательности.

from seq average distinct Возвращает уникальные элементы из последовательности с использованием сравнения по умолчанию.

from seq distinct reverse Инвертирует порядок элементов в последовательности.

from seq reverse skip Обходит заданное количество элементов в последовательности, а затем возвращает остальные элементы.

from seq skip Count skip while Обходит элементы последовательности, если указанное условие истинно, а затем возвращает остальные элементы.

from seq skip while Predicate take Возвращает указанное количество смежных элементов с начала последовательности.

from seq take Count take while или while Возвращает элементы последовательности пока указанное условие истинно.

from seq take while Predicate from seq while Predicate single и try single Возвращает единственный элемент последовательности. В случае отсутствия элементов либо наличия более одного элемента single генерирует исключение, тогда как try single возвращает значение по умолчанию.

from seq single from seq try single first и try first Возвращает первый элемент последовательности. В случае отсутствия элементов first генерирует исключение, тогда как try first возвращает значение по умолчанию.

from seq first from seq try first last и try last Возвращает последний элемент последовательности. В случае отсутствия элементов last генерирует исключение, тогда как try last возвращает значение по умолчанию.

from seq last from seq try last at и try at Возвращает элемент по указанному индексу в последовательности. В случае отсутствия элемента по данному индексу at генерирует исключение, тогда как try at возвращает значение по умолчанию.

from seq at Index from seq try at Index order by Сортирует элементы последовательности в указанном порядке в соответствии с ключом.

from seq order by Selector from seq order by Selector asc from seq order by Selector desc to array Преобразует последовательность в массив.

from seq to array to list Преобразует последовательность в список.

from seq to list bind to Преобразует последовательность в словарь ключ/значение.

from seq bind KeySelector to ValueSelector group by Группирует последовательность по ключу.

from seq group by KeySelector concat Добавляет элементы второй последовательности в конец первой.

from seq1 concat seq2 from seq concat elem intersect Вычисляет пересечение последовательностей.

from seq1 intersect seq2 from seq intersect elem union Вычисляет объединение последовательностей.

from seq1 union seq2 from seq union elem except Вычисляет разницу последовательностей.

from seq1 except seq2 from seq except elem do Выполняет блок выражений expr1, ..., exprN для каждого элемента последовательности и возвращает it.

from seq do expr1; ...; exprN from seq do expr now Создает цикл и перебирает все элементы коллекции. Не имеет результата.

from seq do expr now from a to b do expr1; ...; exprN now Все операции возвращающие другую последовательность кроме to array и to list являются ленивыми, т.е. реально выполняются только в момент когда начинается обращение к их элементам.

Блоки кода

После ключевых слов then, else, do, try, а так же после символа = при описании функции может следовать как одно выражение так и блок выражений, при этом результатом блока становится результат последнего выражения.

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

Если же первое выражение блока начинается на следующей строке или далее, то все выражения тела блока должны иметь большие отступы нежели строка породившая блок. Если отступ текущего выражения меньше или равен отступу этой строки, блок считается завершенным. При этом находящиеся на одной строке выражения блока следует разделять точкой-запятой, а для находящихся на разных строках разделение точкой-запятой необязательно. Конец блока можно пометить опциональным ключевым словом end.

let a = 1

if a > 0 then print a

if a > 0 then print a + 1; print a + 1

if a > 0 then

   print a + 2
   print a + 2
   print a + 2

end

if a > 0 then

   print a + 6;
   print a + 6
   print a + 6; print a + 6
   print a + 6; print a + 6;
   print a + 6

Граф

Все элементы графа унаследованные от базового Trigger имеют следующие внешние переменные:

  1. tigger - ссылка на сам триггер, тип Trigger.
  2. graph - ссылка на граф, тип Graph.
  3. firefly - ссылка на объект типа Firefly приложения Acuario Manager (доступно только при запуске в Acuario Manager).

Триггеры типа ObjectCreated и ObjectUpdated имеют следующие дополнительные внешние параметры:

  1. @object - добавленный или изменившийся объект, тип AbstractObject.
  2. changes - список имен измененных параметров объекта, тип string[].

Триггеры типа ObjectDeleted имеют следующие дополнительные внешние параметры:

  1. @object - удаленный объект, тип AbstractObject.