В блоке операций/выражений можно указывать произвольное количество операций которые должен вычислить бот в процессе своей работы. Операции представляют собой выражения записанные с помощью подмножества языка программирования разговорных ботов описание которого содержится ниже.
Структура операций
Все операции бота в пределах одного блока операций представляют собой одно или несколько выражений на языке прграммирования ботов. Выражения отделяются друг от друга необязательным символом ";", либо символом перевода строки (началом новой строки). Каждое выражение имеет значение. Это значит что выражения могут быть составными
Комментарии
При записи выражений можно указывать комментарии - участки программы которые не участвуют в вычислениях, а выполняют лишь информационную функцию. Есть два вида комментариев:
- Однострочные. Такие комментарии начинаются с двух слэшей // и заканчиваются окончанием строки.
- Многострочные. Начало многострочного комментарии начинается с /* и заканчивается */
Пример комментариев:
// Это однострочный комментарий $x = time() /** * А это уже * многострочный * комментарий */ say("Time is " + $x)
Переменные
Для хранения данных в сценариях ботов применяются переменные. Переменная представляет собой именованный участок памяти бота. Она создаётся при первом её использовании в каком-либо блоке операций. При этом значением по умолчанию для всех переменных является nil.
Имена переменных могут содержать цифры, английские и русские буквы, а также символ подчёркивания.
Существуют три вида переменных, различающихся своей областью видимости:
- Переменные видимые в пределах одного модуля в одном потоке. Доступны для чтения и записи. Названия таких переменных наяинаются с $. Такие переменные удобно использовать для хранения промежуточных операций и вычислений.
- Переменные видимые в пределах одного модуля в разных потоках. Доступны для чтения и записи. Названия переменных уровня модуля начинаются с #. Поскольку такие переменные видны во всех потоках бота их удобно использовать для взаимодействия между потоками.
- Глобальные переменные или переменные окружения. Автоматически задаваемые переменные, которые видны во всех потоках всех модулей бота. Эти переменные доступны только для чтения и хранят информацию о глобальном контексте работы бота. Их имена начинаются с символа @
Примеры записей переменных разных видов:
// Переменные $p и $r доступны только в потоке в котором они определены $p = 2 * 3.14 * $r // Эта переменная доступна во всех потоках в пределах текущего модуля // (модуля в котором находится блок операций в котором определена переменная). #count = queue.size() // @communicationType глобальная переменная только для чтения. Доступна отовсюду. $isChat = @communicationType == "TEXT"
Переменные переменных
Язык выражений бота позоляет динамически вычислять имя переменной в процессе работы бота. Это в частности означает что значением одной переменной может быть имя другой переменной. Или, в более общем случае, именем переменной может быть любое выражение, значением которого является строка.
В примере ниже мы определяем три переменные содержащие названия цветов. Затем мы определяем случайно число от 1 до 3 и далее формируем название одной из переменных с тем чтобы узнать значение случайного цвета.
// Создадим три переменные с именами x1, x2 и x3 $x1 = "red" $x2 = "blue" $x3 = "green" // Случайное число от 1 до 3 $n = math.rand(1, 3) // Получаем цвет динамически сформировав имя переменной с цветом и взяв её значение $color = $("x" + $n)
Можно также использовать значения переменных разных типов:
// $x содержит название переменной #y $x = "y" // #y содержит название глобальной переменной communicationType #y = "communicationType" // Вычисляется так @#$x -> @#("y") -> @#y -> @("communicationType") -> @communicationType $communicationType = @#$x
Типы данных
Существует три примитивных типа данных один объектный тип и специальное значение nil:
Числа
Все числа трактуются как вещественные знаковые с плавающей точкой. Минимальное и максимальное значение определяется той вычислительной средой в которой работает интерпретатор языка выражений.
Строки
Представляют собой произвольную последовательность симолов заключённую в одинарные или двойные кавычки. Двойные кавычки отличаются от одинарных тем что внутри них распознаются следующие специальные последовательности символов:
Последовательность | Значение |
---|---|
\n | Перевод строки |
\r | Возврат каретки |
\t | Горизонтальная табуляция |
\" | Двойная кавычка |
В одинарных кавычках все символы тарктуются как есть за исключением последовательности \' которая означет символ одинарной кавычки.
// Следуюущая команда выведет в чат фразу из двух строк // Привет // "Медвед!" say("Привет\n\"Медвед!\"") // Выведет в чат фразу Привет\n'Медвед!' say('Привет\n\'Медвед!\'')
Булевые (логические) значения
Константы true и false трактуются как булевые, т.е. такие значения у которых есть только два состояния - истина и ложь. Булевые значения удобно применять в выражении условного блока.
$x = true // $x содержит ИСТИНА $y = !$x // $y содержит ЛОЖЬ
Объекты
В стандартной библиотеке языка программирования бота существует ряд функций (операций) значением которых являются так называемые объекты. Объект это особое значение у которого могут быть встроенные свойства и операции или методы. Набор этих свойств и методов определяется типом объекта. Для доступа к свойствам или методам объектов используется оператор точка "."
Например, следущий код получает первое сообщение клиента которое является объектом ClientMessage и далее берёт свойство message (текст сообщения) этого объекта:
// $first содержит значение объекта ClientMessage $first = queue.first() // Получаем значение совойства message $firstMessage = $first.message
Свойства и методы объектов, также как и значения переменных, могут быть вычисляемыми:
$n = rand(0, 1) // $n содержит или 0 или 1 $method = ["first", "last"].get($n) // $method содержит строку first или last (см. получение элемента списка по индексу) $firstOrLast = queue.$method // Получаем первое или последнее сообщение клиента // Или даже так $firstOrLast = queue.(["first", "last"].get($n))
Специальное значение nil
Когда какая-либо переменная не определена, но уже используется в выражении её значением становится nil. Это специльное значение означающее отсутствие какого-либо значения. Это значение также можно присвоить явно:
$x = 1 + 2 // $x содержит 3 $x = nil // $x содержит nil
Операции
В языке выражений бота определенно несколько классов операций. Класс операции определяется её первым аргументом. Например, если первый аргумент операции "+" строка, то будет произведена конкатенация строк. Если же это число, то будет осуществляться сложение чисел.
Приоритеты операций
Чем приоритет выше, тем раньше выполнится операция. Стандартным способом увеличения приоритета являются круглые скобки.
Операция | Приоритет | Ассоциативность | Описание |
---|---|---|---|
** | 12 | правая | Возведение в степень |
+ | 11 | - | Унарный плюс |
- | 11 | - | Унарный минус |
~ | 11 | - | Бинарная инверсия |
! | 10 | - | Логическое отрицание |
* | 9 | левая | Умножение |
/ | 9 | левая | Деление |
\ | 9 | левая | Целочисленное деление |
% | 9 | левая | Остаток от деления |
+ | 8 | левая | Сложение, конкатенация, объединение |
- | 8 | левая | Вычитание |
< | 7 | - | Меньше чем |
<= | 7 | - | Меньше или равно |
> | 7 | - | Больше чем |
>= | 7 | - | Больше или равно |
== | 6 | - | Равно |
!= | 6 | - | Не равно |
& | 5 | левая | Бинарное И |
^ | 4 | левая | Бинарное исключающее ИЛИ |
| | 3 | левая | Бинарное ИЛИ |
&& | 2 | левая | Логическое И |
|| | 1 | левая | Логическое ИЛИ |
= | 0 | правая | Присваивание |
+= | 0 | правая | Сложение с присваиванием |
-= | 0 | правая | Разность с присваиванием |
*= | 0 | правая | Умножение с присваиванием |
/= | 0 | правая | Деление с присваиванием |
\= | 0 | правая | Целочисленное деление с присваиванием |
%= | 0 | правая | Остаток от деления с присваиванием |
**= | 0 | правая | Возведение в степень с присваиванием |
&= | 0 | правая | Бинарное И с присваиванием |
^= | 0 | правая | Бинарное исключающее И с присваиванием |
|= | 0 | правая | Бинарное ИЛИ с присваиванием |
Арифметические операции
Арифметические операции предназначены для работы с числами. Если значение участвующее в арифметической операции не является числом, произойдёт попытка его преобразования в число (см. ниже).
Пример | Результат |
---|---|
+$a | Преобразование $a в число |
-$a | Смена знака $a |
$a + $b | Сумма $a и $b |
$a - $b | Разность между $a и $b |
$a * $b | Умножение $a на $b |
$a / $b | Деление $a на $b |
$a \ $b | Целочисленное деление $a на $b |
$a % $b | Остаток от деления $a на $b |
$a ** $b | Возведение $a в степень $b |
Таблица преобразования других типов данных в число:
Тип | Значение | Результат |
---|---|---|
Логический | true | 1 |
Логический | false | 0 |
Строка | "" | 0 |
Строка | "123.5" | 123.5 |
Строка | "abc" | ошибка |
Объект | любой объект | ошибка |
Логические операции
Логические операции предназначены для работы с булевыми значениями. Если значение не является булевым, то произойдёт попытка его преобразования в булевое значение (см. ниже).