Описание Expression Graph Scripting 2019 — различия между версиями

Материал из Integra-S Wiki
Перейти к: навигация, поиск
(Блоки кода)
 
(не показано 13 промежуточных версий этого же участника)
Строка 5: Строка 5:
 
Следующие ключевые слова являются полностью зарезервированными:
 
Следующие ключевые слова являются полностью зарезервированными:
  
<blockquote> 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.</blockquote>
+
<pre> 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.</pre>
  
 
Следующие ключевые слова являются частично зарезервированными, т.е. используются только в контексте соответствующих выражений:
 
Следующие ключевые слова являются частично зарезервированными, т.е. используются только в контексте соответствующих выражений:
  
<blockquote> 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.</blockquote>
+
<pre> 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.</pre>
  
 
== Комментарии ==
 
== Комментарии ==
 
Поддерживаются однострочные комментарии начинающиеся с символа #
 
Поддерживаются однострочные комментарии начинающиеся с символа #
  
<blockquote> # only single line comments supported </blockquote>
+
<pre> # only single line comments supported </pre>
  
 
== Идентификаторы ==
 
== Идентификаторы ==
Строка 22: Строка 22:
 
Некоторые примеры идентификаторов:
 
Некоторые примеры идентификаторов:
  
<blockquote> x, Hello, m_1, @true, @String </blockquote>
+
<pre> x, Hello, m_1, @true, @String </pre>
  
 
== Литералы ==
 
== Литералы ==
Строка 50: Строка 50:
 
# Нулевая константа имеет тип object, но также неявно преобразуется в любой ссылочный тип.
 
# Нулевая константа имеет тип object, но также неявно преобразуется в любой ссылочный тип.
  
== Встроенные типы ==
+
== Типы ==
 +
=== Встроенные типы ===
 
# Язык выражения определяет следующие примитивные типы :
 
# Язык выражения определяет следующие примитивные типы :
 
## void - см. System.Void.
 
## void - см. System.Void.
Строка 88: Строка 89:
 
## Link - см. acuario2.types.Link.
 
## Link - см. acuario2.types.Link.
 
## Graph - см. acuario2.client.Graph.
 
## Graph - см. acuario2.client.Graph.
На обнуляемую форму типа указывает вопросительный знак после имени типа. Например, bool? Обозначает обнуляемую форму bool.
+
# На обнуляемую форму типа указывает вопросительный знак после имени типа. Например, bool? Обозначает обнуляемую форму bool.
# Дополнительные типы
+
=== Дополнительные типы ===
 
Только зарегистрированные типы могут быть явно указаны в выражениях, а вызовы методов в языке выражений ограничены методами, объявленными в зарегистрированных типах.
 
Только зарегистрированные типы могут быть явно указаны в выражениях, а вызовы методов в языке выражений ограничены методами, объявленными в зарегистрированных типах.
 
 
Дополнительные типы могут быть зарегистрированы во время исполнения при помощи следующих языковых конструкций:
 
Дополнительные типы могут быть зарегистрированы во время исполнения при помощи следующих языковых конструкций:
  
use NameSpace.TypeName [as Alias] [from AssemblyName|"AssemblyPath"]
+
# use NameSpace.TypeName [as Alias] [from AssemblyName|"AssemblyPath"]
use NameSpace.TypeName(GenericTypeName1, ...) as Alias [from AssemblyName|"AssemblyPath"]
+
# use NameSpace.TypeName(GenericTypeName1, ...) as Alias [from AssemblyName|"AssemblyPath"]
use (StringExpression) [as Alias] [from AssemblyName|"AssemblyPath"]
+
# use (StringExpression) [as Alias] [from AssemblyName|"AssemblyPath"]
use new {...} as Alias
+
# use new {...} as Alias
use typedef `...` as Alias
+
# use typedef `...` as Alias
 +
<pre>
 
Где:
 
Где:
[...] - квадратные скобки выделяют необязательный элемент
+
[...] - квадратные скобки выделяют необязательный элемент;
| - символ разделяющий альтернативные элементы
+
| - символ разделяющий альтернативные элементы;
, ... - означает повторение предыдущего элемента 1 или более раз
+
, ... - означает повторение предыдущего элемента 1 или более раз;
new {...} - объявление нового типа, см. оператор new
+
new {...} - объявление нового типа, см. оператор new;
NameSpace - полное пространство имен типа
+
NameSpace - полное пространство имен типа;
TypeName - имя типа
+
TypeName - имя типа;
Alias - псевдоним типа
+
Alias - псевдоним типа;
AssemblyName- имя сборки содержащей тип
+
AssemblyName- имя сборки содержащей тип;
AssemblyPath- полный путь к сборке содержащей тип
+
AssemblyPath- полный путь к сборке содержащей тип;
GenericTypeName1 - первый аргумент общего типа
+
GenericTypeName1 - первый аргумент общего типа;
StringExpression - выражение возвращающее строку и выполняемое на этапе компиляции, см. const
+
StringExpression - выражение возвращающее строку и выполняемое на этапе компиляции, см. const;
typedef `...` - объявление нового типа с сигнатурой совместимой с Dynamic Typedef, см. TypeDef 2017, вещественные типы параметров при этом приводятся к обнуляемой форме (т.е. например: int к int?)
+
typedef `...` - объявление нового типа с сигнатурой совместимой с Dynamic Typedef, см. TypeDef 2017, вещественные типы параметров при этом приводятся к обнуляемой форме (т.е. например: int к int?).
 +
</pre>
 
Например:
 
Например:
  
 +
<pre>
 
use System.Random
 
use System.Random
 
use acuario2.types.SpatialObject from acuario2.types
 
use acuario2.types.SpatialObject from acuario2.types
Строка 129: Строка 132:
 
     </root>
 
     </root>
 
` as Settings
 
` as Settings
 +
</pre>
 
Оператор use можно использовать только на верхнем уровне скрипта, т.е. не допускается его использование внутри блоков кода и функций.
 
Оператор use можно использовать только на верхнем уровне скрипта, т.е. не допускается его использование внутри блоков кода и функций.
  
Редактировать эту секцию
+
=== Преобразование типов ===
Преобразование типовСледующие преобразования неявно выполняются языком:
+
Следующие преобразования неявно выполняются языком:
Из нулевого литерала до любого ссылочного типа или типа, допускающего значение null.
+
# Из нулевого литерала до любого ссылочного типа или типа, допускающего значение null.
Из целочисленного литерала до целочисленного типа или реального типа, если номер находится в диапазоне этого типа.
+
# Из целочисленного литерала до целочисленного типа или реального типа, если номер находится в диапазоне этого типа.
Из реального литерала до реального типа, если номер находится в диапазоне этого типа.
+
# Из реального литерала до реального типа, если номер находится в диапазоне этого типа.
Из строкового литерала до типа перечисления, если строковый литерал содержит имя члена этого типа перечисления.
+
# Из строкового литерала до типа перечисления, если строковый литерал содержит имя члена этого типа перечисления.
Из строкового литерала до Guid, если строковый литерал конвертируется в Guid.
+
# Из строкового литерала до Guid, если строковый литерал конвертируется в Guid.
Из исходного типа, совместимого с целевым типом в соответствии с методом Type.IsAssignableFrom.
+
# Из исходного типа, совместимого с целевым типом в соответствии с методом Type.IsAssignableFrom.
Из типа значения, не допускающего значения null, до формы, допускающей значение null для этого типа значения.
+
# Из типа значения, не допускающего значения null, до формы, допускающей значение null для этого типа значения.
Из числового типа к другому числовому типу с большим диапазоном.
+
# Из числового типа к другому числовому типу с большим диапазоном.
Из любого типа к типу object.
+
# Из любого типа к типу object.
 +
 
 
Язык допускает явные преобразования с использованием следующего синтаксиса:
 
Язык допускает явные преобразования с использованием следующего синтаксиса:
 +
# TypeName(Expression).
 +
# TypeName?(Expression).
 +
# TypeName[](Expression).
  
TypeName(Expression)
+
<pre>
TypeName?(Expression)
 
TypeName[](Expression)
 
 
Где:
 
Где:
 
? - указывает на обнуляемую форму типа
 
? - указывает на обнуляемую форму типа
 
[] - указывает на массив типа
 
[] - указывает на массив типа
 
Expression - какое либо выражение преобразуемое к типу TypeName
 
Expression - какое либо выражение преобразуемое к типу TypeName
 +
</pre>
 +
 
Этот синтаксис может использоваться для выполнения следующих преобразований:
 
Этот синтаксис может использоваться для выполнения следующих преобразований:
Между двумя типами при условии, что Type.IsAssignableFrom истинно в одном или обоих направлениях.
+
# Между двумя типами при условии, что Type.IsAssignableFrom истинно в одном или обоих направлениях.
Между двумя типами обеспечивается один или оба типа интерфейсов.
+
# Между двумя типами обеспечивается один или оба типа интерфейсов.
Между нулевыми и ненулевыми формами любого типа значения.
+
# Между нулевыми и ненулевыми формами любого типа значения.
Между любыми двумя примитивными типами или типами перечисления.
+
# Между любыми двумя примитивными типами или типами перечисления.
Из любого типа в стоку при помощи метода Object.ToString.
+
# Из любого типа в стоку при помощи метода Object.ToString.
Из строки в тип имеющий статический метод Parse(string).
+
# Из строки в тип имеющий статический метод Parse(string).
Из любого "нового" типа языка EGS (см. оператор new {...}) в строку содержащую его JSON представление.
+
# Из любого "нового" типа языка EGS (см. оператор new {...}) в строку содержащую его JSON представление.
Из строки содержащей JSON в соответствующий "новый" типа языка EGS.
+
# Из строки содержащей JSON в соответствующий "новый" типа языка EGS.
Так же язык допускает явные преобразования при помощи оператора as из C# с использованием аналогичного синтаксиса:
+
# Так же язык допускает явные преобразования при помощи оператора as из C# с использованием аналогичного синтаксиса: Expression as TypeName.
  
Expression as TypeName
+
== Операторы ==
Редактировать эту секцию
+
; Доступ к экземпляру поля или экземпляру
Операторы
+
<pre>
Доступ к экземпляру поля или экземпляру
 
 
Доступ к любому общему полю или свойству.
 
Доступ к любому общему полю или свойству.
 
 
x.m
 
x.m
 
Так же возможен безопасный доступ к полю.
 
Так же возможен безопасный доступ к полю.
 
 
x?.m
 
x?.m
в случае нулевого экземпляра возвращается значение по умолчанию типа поля.
+
В случае нулевого экземпляра возвращается значение по умолчанию типа поля.
 
 
 
Так же возможен как безопасный так и обычный доступ к полю имя которого рассчитывается на этапе компиляции, см. оператор const.
 
Так же возможен как безопасный так и обычный доступ к полю имя которого рассчитывается на этапе компиляции, см. оператор const.
 
 
const m = "m"  
 
const m = "m"  
 
x.(m)
 
x.(m)
 
x?.(m)
 
x?.(m)
Вызов метода экземпляра
+
</pre>
 +
 
 +
; Вызов метода экземпляра
 +
<pre>
 
Метод должен быть общедоступным и должен быть объявлен в доступном виде.
 
Метод должен быть общедоступным и должен быть объявлен в доступном виде.
 
 
x.m(…)
 
x.m(…)
 
Так же возможен безопасный вызов метода экземпляра.
 
Так же возможен безопасный вызов метода экземпляра.
 
 
x?.m?()
 
x?.m?()
 
в случае нулевого экземпляра возвращается значение по умолчанию типа результата метода.
 
в случае нулевого экземпляра возвращается значение по умолчанию типа результата метода.
 +
</pre>
  
Доступ к массиву или индексатору
+
; Доступ к массиву или индексатору
 +
<pre>
 
Многомерные массивы не поддерживаются.
 
Многомерные массивы не поддерживаются.
 
 
x[…]
 
x[…]
 
Так же возможен безопасный доступ к массиву или индексатору.
 
Так же возможен безопасный доступ к массиву или индексатору.
 
 
x?[...]
 
x?[...]
 
в случае нулевого экземпляра возвращается значение по умолчанию типа индексатора.
 
в случае нулевого экземпляра возвращается значение по умолчанию типа индексатора.
 +
</pre>
  
Статический доступ к свойствам
+
; Статический доступ к свойствам
 +
<pre>
 
Доступ к любому общему полю или свойству.
 
Доступ к любому общему полю или свойству.
 
 
T.m
 
T.m
Вызов статического метода
+
</pre>
 +
; Вызов статического метода
 +
<pre>
 
Метод должен быть общедоступным и должен быть объявлен в доступном виде.
 
Метод должен быть общедоступным и должен быть объявлен в доступном виде.
 
 
T.m(…)
 
T.m(…)
Явное преобразование или вызов конструктора
+
</pre>
 +
; Явное преобразование или вызов конструктора
 +
<pre>
 
Обратите внимание, что new не требуется перед вызовом конструктора.
 
Обратите внимание, что new не требуется перед вызовом конструктора.
  
Строка 211: Строка 219:
 
T?(…)
 
T?(…)
 
T[](…)
 
T[](…)
Текущий экземпляр
+
</pre>
 +
 
 +
; Текущий экземпляр
 +
<pre>
 
В контексте, где члены текущего объекта неявно входят в область видимости, он используется для обращения к самому объекту целиком.
 
В контексте, где члены текущего объекта неявно входят в область видимости, он используется для обращения к самому объекту целиком.
 +
it
 +
</pre>
  
it
+
; Отрицание
Отрицание
+
<pre>
 
Поддерживаются следующие типы: int, long, decimal, float и double.
 
Поддерживаются следующие типы: int, long, decimal, float и double.
 +
-x
 +
</pre>
  
-x
+
; Логическое отрицание
Логическое отрицание
+
<pre>
 
Операнд должен быть типа bool.
 
Операнд должен быть типа bool.
 
 
!x
 
!x
 
not x
 
not x
Умножение
+
</pre>
 +
 
 +
; Умножение
 +
<pre>
 
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
 
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
 +
x * y
 +
</pre>
  
x * y
+
; Деление
Деление
+
<pre>
 
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
 
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
 +
x / y
 +
</pre>
  
x / y
+
; Остаток
Остаток
+
<pre>
 
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
 
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double.
 
 
x % y
 
x % y
 
x mod y
 
x mod y
Сложение или конкатенация строк
+
</pre>
 +
 
 +
; Сложение или конкатенация строк
 +
<pre>
 
Выполняет конкатенацию строк, если любой из операндов имеет тип string. В противном случае выполняется сложение для поддерживаемых типов int, uint, long, ulong, decimal, float и double, DateTime и TimeSpan.
 
Выполняет конкатенацию строк, если любой из операндов имеет тип string. В противном случае выполняется сложение для поддерживаемых типов int, uint, long, ulong, decimal, float и double, DateTime и TimeSpan.
 +
x + y
 +
</pre>
  
x + y
+
; Вычитание
Вычитание
+
<pre>
 
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double, DateTime и TimeSpan.
 
Поддерживаются следующие типы: int, uint, long, ulong, decimal, float и double, DateTime и TimeSpan.
 +
x – y
 +
</pre>
  
x – y
+
; Конкатенация строк
Конкатенация строк
+
<pre>
 
Операнды могут быть любого типа.
 
Операнды могут быть любого типа.
 +
x..y
 +
</pre>
  
x..y
+
; Равенство
Равенство
+
<pre>
 
Поддерживается для ссылочных типов и примитивных типов.
 
Поддерживается для ссылочных типов и примитивных типов.
 
 
x == y
 
x == y
 
x is y
 
x is y
Неравенство
+
</pre>
 +
 
 +
; Неравенство
 +
<pre>
 
Поддерживается для ссылочных типов и примитивных типов.
 
Поддерживается для ссылочных типов и примитивных типов.
 
 
x != y
 
x != y
 
x <> y
 
x <> y
 
x isnt y
 
x isnt y
 
x is not y
 
x is not y
Меньше
+
</pre>
 +
 
 +
; Меньше
 +
<pre>
 
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
 
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
 +
x < y
 +
</pre>
  
x < y
+
; Больше
Больше
+
<pre>
 
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
 
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
 +
x > y
 +
</pre>
  
x > y
+
; Меньше или равно
Меньше или равно
+
<pre>
 
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
 
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
 +
x <= y
 +
</pre>
  
x <= y
+
; Больше или равно
Больше или равно
+
<pre>
 
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
 
Поддерживается для всех примитивных типов, кроме bool, object и Guid.
 +
x >= y
 +
</pre>
  
x >= y
+
; Логическое И
Логическое И
+
<pre>
 
Операнды должны быть типа bool.
 
Операнды должны быть типа bool.
 
 
x && y
 
x && y
 
x and y
 
x and y
Логическое ИЛИ
+
</pre>
 +
 
 +
; Логическое ИЛИ
 +
<pre>
 
Операнды должны быть типа bool.
 
Операнды должны быть типа bool.
 
 
x || y
 
x || y
 
x or y
 
x or y
Множественное сравнение
+
</pre>
 +
 
 +
; Множественное сравнение
 +
<pre>
 
Операции сравнения, такие как ==, !=, <>, <, >, <=, >=, можно применять к операндам по цепочке.
 
Операции сравнения, такие как ==, !=, <>, <, >, <=, >=, можно применять к операндам по цепочке.
 
Например:
 
Например:
 
 
x1 < x < x2
 
x1 < x < x2
 
 
Эквивалентно следующему:
 
Эквивалентно следующему:
 
(x1 < x) and (x < x2)
 
(x1 < x) and (x < x2)
Оператор ?? (null-coalescing)
+
</pre>
 +
 
 +
; Оператор ?? (null-coalescing)
 +
<pre>
 
Возвращает x если оно не равно null, иначе возвращает y.
 
Возвращает x если оно не равно null, иначе возвращает y.
 
+
x ?? y  
x ?? y
+
эквивалентно  
эквивалентно
 
 
if x isnt null then x else y
 
if x isnt null then x else y
 
Для переменных обнуляемых вещественных типов (например: int?), оператор возвращает необнуляемое значение x если само x не равно null, иначе возвращает y.
 
Для переменных обнуляемых вещественных типов (например: int?), оператор возвращает необнуляемое значение x если само x не равно null, иначе возвращает y.
 
 
Если x является массивом, то
 
Если x является массивом, то
 
 
x ?? empty
 
x ?? empty
 
возвращает x, если оно не равно нулю, иначе возвращает пустой массив соответствующего типа.
 
возвращает x, если оно не равно нулю, иначе возвращает пустой массив соответствующего типа.
Оператор ??? (empty-coalescing)
+
</pre>
 +
 
 +
; Оператор ??? (empty-coalescing)
 +
<pre>
 
Возвращает x если оно является коллекцией, не равно null и не пусто, иначе возвращает y.
 
Возвращает x если оно является коллекцией, не равно null и не пусто, иначе возвращает y.
 
 
x ??? y
 
x ??? y
 
эквивалентно
 
эквивалентно
 
if x isnt empty then x else y
 
if x isnt empty then x else y
Проверка типа
+
</pre>
 +
 
 +
; Проверка типа
 +
<pre>
 
Проверяет является ли x экземпляром типа T, либо конвертируемым в тип T при помощи оператора is.
 
Проверяет является ли x экземпляром типа T, либо конвертируемым в тип T при помощи оператора is.
 
 
x is T
 
x is T
 
x isnt T
 
x isnt T
 
x is not T
 
x is not T
Проверка наличия значения
+
</pre>
 +
 
 +
; Проверка наличия значения
 +
<pre>
 
Проверяет наличие значение выражения x обнуляемого или ссылочного типа.
 
Проверяет наличие значение выражения x обнуляемого или ссылочного типа.
 
 
x is null
 
x is null
 
x isnt null
 
x isnt null
 
x is not null
 
x is not null
Преобразование типа
+
</pre>
 +
 
 +
; Преобразование типа
 +
<pre>
 
Преобразовывает x в тип T при помощи оператора as из языка C# .
 
Преобразовывает x в тип T при помощи оператора as из языка C# .
 +
x as T
 +
</pre>
  
x as T
+
; Проверка наличия элемента в коллекции
Проверка наличия элемента в коллекции
+
<pre>
 
Проверяет наличие элемента x в коллекции y.
 
Проверяет наличие элемента x в коллекции y.
 
Коллекция должна поддерживать интерфейс IEnumerable<T> или IDictionary<K,V>.
 
Коллекция должна поддерживать интерфейс IEnumerable<T> или IDictionary<K,V>.
 
В случае если коллекция является словарем проверяется наличие ключа.
 
В случае если коллекция является словарем проверяется наличие ключа.
 
В случае если первый операнд является строкой, а второй типом перечислимого значения проверяется наличие такого значения в типе.
 
В случае если первый операнд является строкой, а второй типом перечислимого значения проверяется наличие такого значения в типе.
 
 
x in y
 
x in y
 
x is in y
 
x is in y
Строка 340: Строка 393:
 
x is not in y
 
x is not in y
 
"EnumItem" in EnumType
 
"EnumItem" in EnumType
Проверка пустоты коллекции
+
</pre>
 +
 
 +
; Проверка пустоты коллекции
 +
<pre>
 
Проверяет коллекцию x на существование и наличие в ней элементов.
 
Проверяет коллекцию x на существование и наличие в ней элементов.
 
 
x is empty
 
x is empty
 
x isnt empty
 
x isnt empty
 
x is not empty
 
x is not empty
Проверка подобия
+
</pre>
 +
 
 +
; Проверка подобия
 +
<pre>
 
Проверяет соответствие x шаблону y при помощи оператора Like из языка Visual Basic .
 
Проверяет соответствие x шаблону y при помощи оператора Like из языка Visual Basic .
 
 
x like y
 
x like y
 
x is like y
 
x is like y
Строка 359: Строка 416:
 
[ charlist ] - Любой одиночный символ в charlist
 
[ charlist ] - Любой одиночный символ в charlist
 
[! charlist ] - Любой одиночный символ, не включенный в charlist
 
[! charlist ] - Любой одиночный символ, не включенный в charlist
Создание массивов
+
</pre>
 +
 
 +
; Создание массивов
 +
<pre>
 
Создает массив из элементов x1, x2, ..., xn.
 
Создает массив из элементов x1, x2, ..., xn.
 
Тип массива вычисляется из типов его элементов.
 
Тип массива вычисляется из типов его элементов.
 
Если элементы имеют разный тип, то типом массива будет object[].
 
Если элементы имеют разный тип, то типом массива будет object[].
 
 
new [ x1, x2, ..., xn ]
 
new [ x1, x2, ..., xn ]
 
Для создания типизированного но не заполненного массива любой длинны можно воспользоваться обычным вызовом конструктора.
 
Для создания типизированного но не заполненного массива любой длинны можно воспользоваться обычным вызовом конструктора.
 
 
string[](0)
 
string[](0)
 
int[](10)
 
int[](10)
Создание новых классов и их экземпляров
+
</pre>
 +
 
 +
; Создание новых классов и их экземпляров
 +
<pre>
 
Создает новый тип со свойствами x, y и т.д. и экземпляр этого типа.
 
Создает новый тип со свойствами x, y и т.д. и экземпляр этого типа.
 
Свойствам экземпляра присваиваются начальные значения X, Y, и т.д.
 
Свойствам экземпляра присваиваются начальные значения X, Y, и т.д.
 
При регистрации нового типа оператором use константные значения из X, Y, и т.д. становятся значениями свойств по умолчанию.
 
При регистрации нового типа оператором use константные значения из X, Y, и т.д. становятся значениями свойств по умолчанию.
 +
new { x = X, y = Y, ... }
 +
</pre>
  
new { x = X, y = Y, ... }
+
; Создание наборов значений
Создание наборов значений
+
<pre>
 
Создает набор из элементов x1, x2, ..., xn.
 
Создает набор из элементов x1, x2, ..., xn.
 
Набор соответствует типу Tuple платформы .net и таким образом его элементы могут иметь разный тип.
 
Набор соответствует типу Tuple платформы .net и таким образом его элементы могут иметь разный тип.
 +
new ( x1, x2, ..., xn )
 +
</pre>
  
new ( x1, x2, ..., xn )
+
; Присвоение
Присвоение
+
<pre>
 
Присваивает переменной, свойству или индексатору x значение выражения X и возвращает это значение.
 
Присваивает переменной, свойству или индексатору x значение выражения X и возвращает это значение.
 
 
x = X
 
x = X
 
y.x = X
 
y.x = X
 
y[x] = X
 
y[x] = X
Обработка исключений
+
</pre>
 +
 
 +
; Обработка исключений
 +
<pre>
 
Выполняет выражения x1,..., xn, в случае удачи возвращает xn, а в случае ошибки выполняет выражения y1,..., yn и возвращает yn.
 
Выполняет выражения x1,..., xn, в случае удачи возвращает xn, а в случае ошибки выполняет выражения y1,..., yn и возвращает yn.
 
xn и yn должны иметь конвертируемые типы.
 
xn и yn должны иметь конвертируемые типы.
 
При отсутствии оператора else, в случае ошибки возвращается значение по умолчанию типа выражения xn.
 
При отсутствии оператора else, в случае ошибки возвращается значение по умолчанию типа выражения xn.
 
 
try x1; ...; xn else y1; ...; yn
 
try x1; ...; xn else y1; ...; yn
 
try x1; ...; xn else y1; ...; yn
 
try x1; ...; xn else y1; ...; yn
Строка 396: Строка 462:
 
try x
 
try x
 
try x1; ...; xn  
 
try x1; ...; xn  
Глобальная переменная last_error (типа System.Excetpion) содержит ссылку на последнюю произосшедшую ошибку. Переменная доступна в любом месте кода.
+
Глобальная переменная last_error (типа System.Excetpion) содержит ссылку на последнюю произошедшую ошибку. Переменная доступна в любом месте кода.
 +
</pre>
  
Установка текущего экземпляра
+
; Установка текущего экземпляра
 +
<pre>
 
Устанавливает в качестве оператора it результат x и выполняет с ним блок операций y1,..., yn
 
Устанавливает в качестве оператора it результат x и выполняет с ним блок операций y1,..., yn
 
 
with x do y1; ...; yn
 
with x do y1; ...; yn
 
with x do y1; ...; yn  
 
with x do y1; ...; yn  
 
with x do y
 
with x do y
 
Например:
 
Например:
 
 
x.p1 = y1; x.p2 = y2; x.p3 = y3
 
x.p1 = y1; x.p2 = y2; x.p3 = y3
 
 
Эквивалентно следующему:
 
Эквивалентно следующему:
 
with x do p1 = y1; p2 = y2; p3 = y3
 
with x do p1 = y1; p2 = y2; p3 = y3
 
 
Члены объекта it имеют меньший приоритет нежели параметры скрипта, переданные ему при запуске и переменные объявленные во время исполнения скрипта видимые в текущем блоке кода.
 
Члены объекта it имеют меньший приоритет нежели параметры скрипта, переданные ему при запуске и переменные объявленные во время исполнения скрипта видимые в текущем блоке кода.
 
Обращаться к членам it перекрытым параметрами и переменными можно следующим образом:
 
Обращаться к членам it перекрытым параметрами и переменными можно следующим образом:
Строка 418: Строка 482:
 
   it.p2 = y2
 
   it.p2 = y2
 
end
 
end
Объявление переменных
+
</pre>
 +
 
 +
; Объявление переменных
 +
<pre>
 
Объявляет переменную x типа выражения справа от = и присваивает ей результат этого выражения.
 
Объявляет переменную x типа выражения справа от = и присваивает ей результат этого выражения.
 
 
let x = 0
 
let x = 0
 
let x = false
 
let x = false
Строка 428: Строка 494:
 
Объявленная переменная видима во всем блоке, в котором она объявлена, начиная с места объявления.
 
Объявленная переменная видима во всем блоке, в котором она объявлена, начиная с места объявления.
 
Возможно повторное объявление переменных с тем же именем в том же блоке.
 
Возможно повторное объявление переменных с тем же именем в том же блоке.
 +
</pre>
  
Объявление набора переменных
+
; Объявление набора переменных
 +
<pre>
 
Объявляет переменные с именами указанными в скобках и присваивает им соответствующие их месту элементы набора справа от знака равенства.
 
Объявляет переменные с именами указанными в скобках и присваивает им соответствующие их месту элементы набора справа от знака равенства.
  
Строка 436: Строка 504:
 
let (, x, y) = new (1, 2, 3) # элементы можно пропускать
 
let (, x, y) = new (1, 2, 3) # элементы можно пропускать
 
let (x, y) = new (y, x)    # можно использовать для обмена значениями
 
let (x, y) = new (y, x)    # можно использовать для обмена значениями
Объявление переменных сохраняющих значение между вызовами
+
</pre>
 +
 
 +
; Объявление переменных сохраняющих значение между вызовами
 +
<pre>
 
Так же как и предыдущее, объявляет переменную x типа выражения справа от = и присваивает ей результат этого выражения, но делает это только при первом выполнении скрипта после компиляции. При последующих выполнениях переменная содержит тоже значение, однако может быть изменена при помощи присвоения.
 
Так же как и предыдущее, объявляет переменную x типа выражения справа от = и присваивает ей результат этого выражения, но делает это только при первом выполнении скрипта после компиляции. При последующих выполнениях переменная содержит тоже значение, однако может быть изменена при помощи присвоения.
 
 
once ticks = Environment.TickCount # присвоит при первом запуске и сохранит значение при последующих
 
once ticks = Environment.TickCount # присвоит при первом запуске и сохранит значение при последующих
 
Обращение к таким переменным потокобезопасно.
 
Обращение к таким переменным потокобезопасно.
 +
</pre>
  
Объявление констант
+
; Объявление констант
 +
<pre>
 
Объявляет константу x типа выражения справа от = и присваивает ей результат этого выражения, вычисляемого на этапе компиляции.
 
Объявляет константу x типа выражения справа от = и присваивает ей результат этого выражения, вычисляемого на этапе компиляции.
 
 
const x = 2
 
const x = 2
 
const xx = x * x
 
const xx = x * x
 
Следует помнить, что в отличии от других языков, EGS не поддерживает констант времени исполнения, выражения после const вычисляются на этапе компиляции, и таким образом ключевое слово const (равно как и use) являются директивами компилятора языка.
 
Следует помнить, что в отличии от других языков, EGS не поддерживает констант времени исполнения, выражения после const вычисляются на этапе компиляции, и таким образом ключевое слово const (равно как и use) являются директивами компилятора языка.
 +
</pre>
  
Объявление функций
+
; Объявление функций
 +
<pre>
 
Объявляет функцию x с аргументами p1,..., pn заданных типов.
 
Объявляет функцию x с аргументами p1,..., pn заданных типов.
 
Тип результата вычисляется по типу последнего выражения в ее теле.
 
Тип результата вычисляется по типу последнего выражения в ее теле.
Строка 456: Строка 529:
 
let f(p1 as T1, ..., pn as Tn) = x1; ...; xn  
 
let f(p1 as T1, ..., pn as Tn) = x1; ...; xn  
 
let f() = x
 
let f() = x
 
 
f(p1, ..., pn)
 
f(p1, ..., pn)
 
f()
 
f()
 
Параметры такой функции перекрывают внутри блока кода функции возможные имена внешних параметров скрипта и переменных объявленных ранее.
 
Параметры такой функции перекрывают внутри блока кода функции возможные имена внешних параметров скрипта и переменных объявленных ранее.
 
 
Альтернативный синтаксис позволяет создавать функции с именованными параметрами имеющими значения по умолчанию.
 
Альтернативный синтаксис позволяет создавать функции с именованными параметрами имеющими значения по умолчанию.
 
 
let f{p1 = X1, ..., pn = Xn} = x1; ...; xn
 
let f{p1 = X1, ..., pn = Xn} = x1; ...; xn
 
 
f{p1 = X1, ..., pn = Xn}
 
f{p1 = X1, ..., pn = Xn}
 
f{p1 = X1}
 
f{p1 = X1}
 
Функция с именованными параметрами, по сути, представляет собой обычную функцию с одним параметром установленным в качестве текущего экземпляра it.
 
Функция с именованными параметрами, по сути, представляет собой обычную функцию с одним параметром установленным в качестве текущего экземпляра it.
 
Следовательно к именованным параметрам можно обращаться так же через it, что может быть необходимо так, как внешние параметры скрипта и переменные объявленных ранее перекрывают доступ к членам it.
 
Следовательно к именованным параметрам можно обращаться так же через it, что может быть необходимо так, как внешние параметры скрипта и переменные объявленных ранее перекрывают доступ к членам it.
 
 
Так же возможно расширение функционала оператора is при помощи объявления предикатов с одним или двумя параметрами.
 
Так же возможно расширение функционала оператора is при помощи объявления предикатов с одним или двумя параметрами.
  
Строка 475: Строка 543:
 
if even(x) then ...
 
if even(x) then ...
 
if x is even then ...
 
if x is even then ...
 
 
let square(x as int, y as int) = x is y * y
 
let square(x as int, y as int) = x is y * y
 
if square(x, y) then ...
 
if square(x, y) then ...
 
if x is square y then ...
 
if x is square y then ...
Объявление обобщенных функций
+
</pre>
 +
 
 +
; Объявление обобщенных функций
 +
<pre>
 
Обобщенные функции объявляются так же как обычные, но без указания типов аргументов.
 
Обобщенные функции объявляются так же как обычные, но без указания типов аргументов.
 
Для определения типов аргументов, компиляция обобщенной функции откладывается то того момента в коде, когда она реально будет вызвана. Повторный вызов функции с отличными типами аргументов вызывает компиляцию еще одного ее варианта. Таким образом обобщенные функции похожи на макросы в других языках и компилируются в контексте вызова, а не определения.
 
Для определения типов аргументов, компиляция обобщенной функции откладывается то того момента в коде, когда она реально будет вызвана. Повторный вызов функции с отличными типами аргументов вызывает компиляцию еще одного ее варианта. Таким образом обобщенные функции похожи на макросы в других языках и компилируются в контексте вызова, а не определения.
Строка 485: Строка 555:
 
let f(p1, ..., pn) = x1; ...; xn
 
let f(p1, ..., pn) = x1; ...; xn
 
let f(p1, ..., pn) = x1; ...; xn  
 
let f(p1, ..., pn) = x1; ...; xn  
 
 
f(p1, ..., pn)
 
f(p1, ..., pn)
 
Параметры обобщенной функции перекрывают внутри блока кода функции возможные имена внешних параметров скрипта и переменных объявленных ранее.
 
Параметры обобщенной функции перекрывают внутри блока кода функции возможные имена внешних параметров скрипта и переменных объявленных ранее.
 
Из-за отложенной компиляции в обобщенной функции видны не только определения сделанные раньше нее (как для обычных функций), но и те которые были сделаны вплоть первого вызова этой обобщенной функции с данным набором типов аргументов.
 
Из-за отложенной компиляции в обобщенной функции видны не только определения сделанные раньше нее (как для обычных функций), но и те которые были сделаны вплоть первого вызова этой обобщенной функции с данным набором типов аргументов.
 
Таким образом для обобщенных функций возможен взаимный рекурсивный вызов.
 
Таким образом для обобщенных функций возможен взаимный рекурсивный вызов.
 +
</pre>
  
Условный оператор
+
; Условный оператор
 +
</pre>
 
В случае выполнения условия x выполняет выражения x1,..., xn, иначе в случае выполнения условия y выполняет выражения y1,..., yn, иначе выполняет выражения z1,..., zn.
 
В случае выполнения условия x выполняет выражения x1,..., xn, иначе в случае выполнения условия y выполняет выражения y1,..., yn, иначе выполняет выражения z1,..., zn.
 
В случае отсутствия последнего оператора else возвращает значение по умолчанию типа результата предыдущей условной ветки.
 
В случае отсутствия последнего оператора else возвращает значение по умолчанию типа результата предыдущей условной ветки.
Строка 503: Строка 574:
  
 
if x is Item i then print i.." is item"  
 
if x is Item i then print i.." is item"  
if x is Link l then print l.." is link"  
+
if x is Link l then print l.." is link"
Оператор множественного выбора
+
</pre>
 +
 
 +
; Оператор множественного выбора
 +
<pre>
 
В случае выполнения условия x is x1 выполняет выражение или блок y1, иначе в случае выполнения условия x is xN выполняет выражение или блок yN, иначе выполняет выражение или блок z.
 
В случае выполнения условия x is x1 выполняет выражение или блок y1, иначе в случае выполнения условия x is xN выполняет выражение или блок yN, иначе выполняет выражение или блок z.
 
В случае отсутствия последнего else возвращает значение по умолчанию типа результата предыдущей условной ветки.
 
В случае отсутствия последнего else возвращает значение по умолчанию типа результата предыдущей условной ветки.
Строка 545: Строка 619:
 
   switch x
 
   switch x
 
     when even then x.." is even"  
 
     when even then x.." is even"  
     when odd  then x.." is odd"  
+
     when odd  then x.." is odd"
Тип выражения
+
</pre>
 +
 
 +
; Тип выражения
 +
<pre>
 
Заменяет выражение константой содержащей его тип.
 
Заменяет выражение константой содержащей его тип.
 
 
typeof x
 
typeof x
 
typeof x.a
 
typeof x.a
Асинхронное выполнение
+
</pre>
 +
 
 +
; Асинхронное выполнение
 +
<pre>
 
Выполняет выражение следующее после ключевого слова async асинхронно т.е. в другом потоке.
 
Выполняет выражение следующее после ключевого слова async асинхронно т.е. в другом потоке.
  
Строка 557: Строка 636:
 
   async f(x)
 
   async f(x)
 
   f(x)
 
   f(x)
Ожидание асинхронное результата
+
</pre>
 +
 
 +
; Ожидание асинхронное результата
 +
<pre>
 
Ожидает выполнения асинхронного выражения и возвращает его значение.
 
Ожидает выполнения асинхронного выражения и возвращает его значение.
  
 
   let f(x as T) = ...
 
   let f(x as T) = ...
 
   await async f(x)
 
   await async f(x)
Печать
+
</pre>
 +
 
 +
; Печать
 +
<pre>
 
Печатает в отладочный поток значение выражения x.
 
Печатает в отладочный поток значение выражения x.
 
Печатает в отладочный поток значения выражений x1,..., xn через пробел.
 
Печатает в отладочный поток значения выражений x1,..., xn через пробел.
Строка 569: Строка 654:
 
print(x)
 
print(x)
 
print(x1, ..., xn)
 
print(x1, ..., xn)
Ошибка времени исполнения
+
</pre>
 +
 
 +
; Ошибка времени исполнения
 +
<pre>
 
Вызывает исключение времени исполнения с текстом msg.
 
Вызывает исключение времени исполнения с текстом msg.
 
 
error msg
 
error msg
 
error(msg)
 
error(msg)
Проверка условия во времени компиляции
+
</pre>
 +
 
 +
; Проверка условия во времени компиляции
 +
<pre>
 
Проверяет условие x во время компиляции, и в случае false вызывает ошибку компиляции со стандартным текстом (если специфический текст не указан вторым параметром).
 
Проверяет условие x во время компиляции, и в случае false вызывает ошибку компиляции со стандартным текстом (если специфический текст не указан вторым параметром).
  
Строка 580: Строка 670:
 
assert(x)
 
assert(x)
 
assert(x, msg)
 
assert(x, msg)
Выполнение выражения во времени компиляции
+
</pre>
 +
 
 +
; Выполнение выражения во времени компиляции
 +
<pre>
 
Выполняет выражение во время компиляции и заменяет его на результат.
 
Выполняет выражение во время компиляции и заменяет его на результат.
 +
eval x
 +
</pre>
  
eval x
+
; Помещение выражения в рамки
Помещение выражения в рамки
+
<pre>
 
Выражение должно состоять из одного или двух условий сравнения на <, <=, >, >= или !=, константных операндов и одного неконстантного операнда. Если выражение выполняется, то возвращается неконстантный операнд, иначе возвращается тот операнд который первым привел к невыполнению выражения, либо выражение после else, если указанно.
 
Выражение должно состоять из одного или двух условий сравнения на <, <=, >, >= или !=, константных операндов и одного неконстантного операнда. Если выражение выполняется, то возвращается неконстантный операнд, иначе возвращается тот операнд который первым привел к невыполнению выражения, либо выражение после else, если указанно.
  
Строка 591: Строка 686:
 
check (0 <= x/y <= 1)
 
check (0 <= x/y <= 1)
 
check 0 < x < 1 else -1
 
check 0 < x < 1 else -1
Диапазон
+
</pre>
 +
 
 +
; Диапазон
 +
<pre>
 
Создает коллекцию чисел типа int начиная с x и до y
 
Создает коллекцию чисел типа int начиная с x и до y
  
 
from x to y
 
from x to y
Редактировать эту секцию
+
</pre>
Операции над перечисляемыми типами
+
 
 +
== Операции над перечисляемыми типами ==
 
Поддерживаются следующие монадические операции над перечисляемыми типами:
 
Поддерживаются следующие монадические операции над перечисляемыми типами:
  
of type
+
<pre>
Фильтрует элементы IEnumerable на основе указанного типа.
+
of type - фильтрует элементы IEnumerable на основе указанного типа.
 
 
 
from seq of type TypeName
 
from seq of type TypeName
cast to
+
</pre>
Преобразует элементы IEnumerable в указанный тип.
 
  
 +
<pre>
 +
cast to - преобразует элементы IEnumerable в указанный тип.
 
from seq cast to TypeName
 
from seq cast to TypeName
select
+
</pre>
Проецирует каждый элемент последовательности в новую форму.
 
  
 +
<pre>
 +
select - проецирует каждый элемент последовательности в новую форму.
 
from seq select Selector
 
from seq select Selector
select many
+
</pre>
Проецирует каждый элемент последовательности в IEnumerable и выравнивает полученные последовательности в одну последовательность.
 
  
 +
<pre>
 +
select many - проецирует каждый элемент последовательности в IEnumerable и выравнивает полученные последовательности в одну последовательность.
 
from seq select many Selector
 
from seq select many Selector
where
+
</pre>
Фильтрует последовательность значений на основе предиката.
 
  
 +
<pre>
 +
where - фильтрует последовательность значений на основе предиката.
 
from seq where Predicate
 
from seq where Predicate
any
+
</pre>
Определяет, удовлетворяет ли какой-либо элемент последовательности условию.
 
  
from seq any Predicate
+
<pre>
all
+
any - определяет, удовлетворяет ли какой-либо элемент последовательности условию.
Определяет, удовлетворяют ли все элементы последовательности условию.
+
from seq any Predicate
 +
</pre>
  
 +
<pre>
 +
all - определяет, удовлетворяют ли все элементы последовательности условию.
 
from seq all Predicate
 
from seq all Predicate
count
+
</pre>
Возвращает количество элементов в последовательности.
 
Возвращает число, которое представляет, сколько элементов в указанной последовательности удовлетворяют условию.
 
  
 +
<pre>
 +
count - возвращает количество элементов в последовательности. Возвращает число, которое представляет, сколько элементов в указанной последовательности удовлетворяют условию.
 
from seq count all
 
from seq count all
 
from seq count Predicate
 
from seq count Predicate
min
+
</pre>
Вызывает функцию преобразования для каждого элемента общей последовательности и возвращает минимальное результирующее значение.
 
  
 +
<pre>
 +
min - вызывает функцию преобразования для каждого элемента общей последовательности и возвращает минимальное результирующее значение.
 
from seq min
 
from seq min
max
+
</pre>
Вызывает функцию преобразования для каждого элемента общей последовательности и возвращает максимальное результирующее значение.
 
  
 +
<pre>
 +
max - вызывает функцию преобразования для каждого элемента общей последовательности и возвращает максимальное результирующее значение.
 
from seq max
 
from seq max
sum
+
</pre>
Вычисляет сумму последовательности значений, которая получается при вызове функции преобразования для каждого элемента входной последовательности.
 
  
 +
<pre>
 +
sum - вычисляет сумму последовательности значений, которая получается при вызове функции преобразования для каждого элемента входной последовательности.
 
from seq sum
 
from seq sum
average
+
</pre>
Вычисляет среднее значение последовательности значений, которое получается при вызове функции преобразования для каждого элемента входной последовательности.
 
  
 +
<pre>
 +
average - вычисляет среднее значение последовательности значений, которое получается при вызове функции преобразования для каждого элемента входной последовательности.
 
from seq average
 
from seq average
distinct
+
</pre>
Возвращает уникальные элементы из последовательности с использованием сравнения по умолчанию.
 
  
 +
<pre>
 +
distinct - возвращает уникальные элементы из последовательности с использованием сравнения по умолчанию.
 
from seq distinct
 
from seq distinct
reverse
+
</pre>
Инвертирует порядок элементов в последовательности.
 
  
 +
<pre>
 +
reverse инвертирует порядок элементов в последовательности.
 
from seq reverse
 
from seq reverse
skip
+
</pre>
Обходит заданное количество элементов в последовательности, а затем возвращает остальные элементы.
 
  
 +
<pre>
 +
skip - обходит заданное количество элементов в последовательности, а затем возвращает остальные элементы.
 
from seq skip Count
 
from seq skip Count
skip while
+
</pre>
Обходит элементы последовательности, если указанное условие истинно, а затем возвращает остальные элементы.
 
  
 +
<pre>
 +
skip while - обходит элементы последовательности, если указанное условие истинно, а затем возвращает остальные элементы.
 
from seq skip while Predicate
 
from seq skip while Predicate
take
+
</pre>
Возвращает указанное количество смежных элементов с начала последовательности.
 
  
 +
<pre>
 +
take - возвращает указанное количество смежных элементов с начала последовательности.
 
from seq take Count
 
from seq take Count
take while или while
+
</pre>
Возвращает элементы последовательности пока указанное условие истинно.
 
  
 +
<pre>
 +
take while или while - возвращает элементы последовательности пока указанное условие истинно.
 
from seq take while Predicate
 
from seq take while Predicate
 
from seq while Predicate
 
from seq while Predicate
single и try single
+
</pre>
Возвращает единственный элемент последовательности. В случае отсутствия элементов либо наличия более одного элемента single генерирует исключение, тогда как try single возвращает значение по умолчанию.
 
  
 +
<pre>
 +
single и try single - возвращает единственный элемент последовательности. В случае отсутствия элементов либо наличия более одного элемента single генерирует исключение, тогда как try single возвращает значение по умолчанию.
 
from seq single
 
from seq single
 
from seq try single
 
from seq try single
first и try first
+
</pre>
Возвращает первый элемент последовательности. В случае отсутствия элементов first генерирует исключение, тогда как try first возвращает значение по умолчанию.
 
  
 +
<pre>
 +
first и try first - возвращает первый элемент последовательности. В случае отсутствия элементов first генерирует исключение, тогда как try first возвращает значение по умолчанию.
 
from seq first
 
from seq first
 
from seq try first
 
from seq try first
last и try last
+
</pre>
Возвращает последний элемент последовательности. В случае отсутствия элементов last генерирует исключение, тогда как try last возвращает значение по умолчанию.
 
  
 +
<pre>
 +
last и try last  - возвращает последний элемент последовательности. В случае отсутствия элементов last генерирует исключение, тогда как try last возвращает значение по умолчанию.
 
from seq last
 
from seq last
 
from seq try last
 
from seq try last
at и try at
+
</pre>
Возвращает элемент по указанному индексу в последовательности. В случае отсутствия элемента по данному индексу at генерирует исключение, тогда как try at возвращает значение по умолчанию.
 
  
 +
<pre>
 +
at и try at - возвращает элемент по указанному индексу в последовательности. В случае отсутствия элемента по данному индексу at генерирует исключение, тогда как try at возвращает значение по умолчанию.
 
from seq at Index
 
from seq at Index
 
from seq try at Index
 
from seq try at Index
order by
+
</pre>
Сортирует элементы последовательности в указанном порядке в соответствии с ключом.
 
  
 +
<pre>
 +
order by - сортирует элементы последовательности в указанном порядке в соответствии с ключом.
 
from seq order by Selector
 
from seq order by Selector
 
from seq order by Selector asc
 
from seq order by Selector asc
 
from seq order by Selector desc
 
from seq order by Selector desc
to array
+
</pre>
Преобразует последовательность в массив.
 
  
 +
<pre>
 +
to array  -преобразует последовательность в массив.
 
from seq to array
 
from seq to array
to list
+
</pre>
Преобразует последовательность в список.
 
  
 +
<pre>
 +
to list - преобразует последовательность в список.
 
from seq to list
 
from seq to list
bind to
+
</pre>
Преобразует последовательность в словарь ключ/значение.
 
  
 +
<pre>
 +
bind to - преобразует последовательность в словарь ключ/значение.
 
from seq bind KeySelector to ValueSelector
 
from seq bind KeySelector to ValueSelector
group by
+
</pre>
Группирует последовательность по ключу.
 
  
 +
<pre>
 +
group by - группирует последовательность по ключу.
 
from seq group by KeySelector
 
from seq group by KeySelector
concat
+
</pre>
Добавляет элементы второй последовательности в конец первой.
 
  
 +
<pre>
 +
concat - добавляет элементы второй последовательности в конец первой.
 
from seq1 concat seq2
 
from seq1 concat seq2
 
from seq concat elem
 
from seq concat elem
intersect
+
</pre>
Вычисляет пересечение последовательностей.
 
  
 +
<pre>
 +
intersect - вычисляет пересечение последовательностей.
 
from seq1 intersect seq2
 
from seq1 intersect seq2
 
from seq intersect elem
 
from seq intersect elem
union
+
</pre>
Вычисляет объединение последовательностей.
 
  
 +
<pre>
 +
union - вычисляет объединение последовательностей.
 
from seq1 union seq2
 
from seq1 union seq2
 
from seq union elem
 
from seq union elem
except
+
</pre>
Вычисляет разницу последовательностей.
 
  
 +
<pre>
 +
except - вычисляет разницу последовательностей.
 
from seq1 except seq2
 
from seq1 except seq2
 
from seq except elem
 
from seq except elem
do
+
</pre>
Выполняет блок выражений expr1, ..., exprN для каждого элемента последовательности и возвращает it.
 
  
 +
<pre>
 +
do - выполняет блок выражений expr1, ..., exprN для каждого элемента последовательности и возвращает it.
 
from seq do expr1; ...; exprN
 
from seq do expr1; ...; exprN
 
from seq do expr
 
from seq do expr
now
+
</pre>
Создает цикл и перебирает все элементы коллекции. Не имеет результата.
 
  
 +
<pre>
 +
now  - Создает цикл и перебирает все элементы коллекции. Не имеет результата.
 
from seq do expr now
 
from seq do expr now
 
from a to b do expr1; ...; exprN now
 
from a to b do expr1; ...; exprN now
 +
</pre>
 
Все операции возвращающие другую последовательность кроме to array и to list являются ленивыми, т.е. реально выполняются только в момент когда начинается обращение к их элементам.
 
Все операции возвращающие другую последовательность кроме to array и to list являются ленивыми, т.е. реально выполняются только в момент когда начинается обращение к их элементам.
  
Редактировать эту секцию
+
== Блоки кода ==
Блоки кода
+
После ключевых слов then, else, do, try, а так же после символа = при описании функции может следовать как одно выражение так и блок выражений, при этом результатом блока становится результат последнего выражения.<br />
После ключевых слов then, else, do, try, а так же после символа = при описании функции может следовать как одно выражение так и блок выражений, при этом результатом блока становится результат последнего выражения.
+
Если первое выражение блока начинается на той же строке, то остальные выражения блока следует разделять точкой-запятой. Блок считается завершенным, если после очередного выражения не следует точка-запятая.<br />
 
 
Если первое выражение блока начинается на той же строке, то остальные выражения блока следует разделять точкой-запятой. Блок считается завершенным, если после очередного выражения не следует точка-запятая.
 
 
 
 
Если же первое выражение блока начинается на следующей строке или далее, то все выражения тела блока должны иметь большие отступы нежели строка породившая блок. Если отступ текущего выражения меньше или равен отступу этой строки, блок считается завершенным. При этом находящиеся на одной строке выражения блока следует разделять точкой-запятой, а для находящихся на разных строках разделение точкой-запятой необязательно. Конец блока можно пометить опциональным ключевым словом end.
 
Если же первое выражение блока начинается на следующей строке или далее, то все выражения тела блока должны иметь большие отступы нежели строка породившая блок. Если отступ текущего выражения меньше или равен отступу этой строки, блок считается завершенным. При этом находящиеся на одной строке выражения блока следует разделять точкой-запятой, а для находящихся на разных строках разделение точкой-запятой необязательно. Конец блока можно пометить опциональным ключевым словом end.
 
+
<pre>
 
let a = 1
 
let a = 1
  
Строка 774: Строка 901:
 
     print a + 6; print a + 6;
 
     print a + 6; print a + 6;
 
     print a + 6
 
     print a + 6
 +
</pre>
  
Редактировать эту секцию
+
== Граф ==
Граф
 
 
Все элементы графа унаследованные от базового Trigger имеют следующие внешние переменные:
 
Все элементы графа унаследованные от базового Trigger имеют следующие внешние переменные:
tigger - ссылка на сам триггер, тип Trigger;
+
# tigger - ссылка на сам триггер, тип Trigger.
graph - ссылка на граф, тип Graph;
+
# graph - ссылка на граф, тип Graph.
firefly - ссылка на объект типа Firefly приложения Acuario Manager (доступно только при запуске в Acuario Manager);
+
# firefly - ссылка на объект типа Firefly приложения Acuario Manager (доступно только при запуске в Acuario Manager).
 
Триггеры типа ObjectCreated и ObjectUpdated имеют следующие дополнительные внешние параметры:
 
Триггеры типа ObjectCreated и ObjectUpdated имеют следующие дополнительные внешние параметры:
@object - добавленный или изменившийся объект, тип AbstractObject;
+
# @object - добавленный или изменившийся объект, тип AbstractObject.
changes - список имен измененных параметров объекта, тип string[];
+
# changes - список имен измененных параметров объекта, тип string[].
 
Триггеры типа ObjectDeleted имеют следующие дополнительные внешние параметры:
 
Триггеры типа ObjectDeleted имеют следующие дополнительные внешние параметры:
@object - удаленный объект, тип AbstractObject;
+
# @object - удаленный объект, тип AbstractObject.

Текущая версия на 11:54, 4 августа 2021

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

Язык 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
Шаблон оператора поддерживает следующие контрольные символы:
? - Любой одиночный символ
* - Ноль или более символов
# - Любая цифра от 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)
Параметры обобщенной функции перекрывают внутри блока кода функции возможные имена внешних параметров скрипта и переменных объявленных ранее.
Из-за отложенной компиляции в обобщенной функции видны не только определения сделанные раньше нее (как для обычных функций), но и те которые были сделаны вплоть первого вызова этой обобщенной функции с данным набором типов аргументов.
Таким образом для обобщенных функций возможен взаимный рекурсивный вызов.
Условный оператор

</pre> В случае выполнения условия 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" </pre>

Оператор множественного выбора
В случае выполнения условия 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.