В блоке операций/выражений можно указывать произвольное количество операций которые должен вычислить бот в процессе своей работы. Операции представляют собой выражения записанные с помощью подмножества языка программирования разговорных ботов описание которого содержится ниже.
Оглавление | ||
---|---|---|
|
Структура операций
Все операции бота в пределах одного блока операций представляют собой одно или несколько выражений на языке прграммирования ботов. Выражения отделяются друг от друга необязательным символом ";", либо символом перевода строки (началом новой строки). Каждое выражение имеет значение. Это значит что выражения могут быть составными.
Комментарии
При записи выражений можно указывать комментарии - участки программы которые не участвуют в вычислениях, а выполняют лишь информационную функцию. Есть два вида комментариев:
...
Блок кода | ||
---|---|---|
| ||
// Это однострочный комментарий $x = time() /** * А это уже * многострочный * комментарий */ say("Time is " + $x) |
Переменные
Для хранения данных в сценариях ботов применяются переменные. Переменная представляет собой именованный участок памяти бота. Она создаётся при первом её использовании в каком-либо блоке операций. При этом значением по умолчанию для всех переменных является nil.
...
Блок кода | ||
---|---|---|
| ||
$('日本') = 123 // Создали переменную c именем 日本 $x = $('日本') // $x теперь равна 123 $(math.rand(1, 2)) = 0 // Динамически создаём переменную с именем 1 или 2 и присваеваем ей значение 0 |
Переменные переменных
Язык выражений бота позоляет динамически вычислять имя переменной в процессе работы бота. Это в частности означает что значением одной переменной может быть имя другой переменной. Или, в более общем случае, именем переменной может быть любое выражение, значением которого является строка.
...
Блок кода | ||
---|---|---|
| ||
// $x содержит название переменной #y $x = "y" // #y содержит название глобальной переменной communicationType #y = "communicationType" // Вычисляется так @#$x -> @#("y") -> @#y -> @("communicationType") -> @communicationType $communicationType = @#$x |
Типы данных
Существует три примитивных типа данных один объектный тип и специальное значение nil:
Числа
Все числа трактуются как вещественные знаковые с плавающей точкой. Минимальное и максимальное значение определяется той вычислительной средой в которой работает интерпретатор языка выражений.
Строки
Представляют собой произвольную последовательность симолов заключённую в одинарные или двойные кавычки. Двойные кавычки отличаются от одинарных тем что внутри них распознаются следующие специальные последовательности символов:
...
Блок кода | ||
---|---|---|
| ||
// Следуюущая команда выведет в чат фразу из двух строк // Привет // "Медвед!" say("Привет\n\"Медвед!\"") // Выведет в чат фразу Привет\n'Медвед!' say('Привет\n\'Медвед!\'') |
Булевые (логические) значения
Константы true и false трактуются как булевые, т.е. такие значения у которых есть только два состояния - истина и ложь. Булевые значения удобно применять в выражении условного блока.
Блок кода | ||
---|---|---|
| ||
$x = true // $x содержит ИСТИНА $y = !$x // $y содержит ЛОЖЬ |
Объекты
В стандартной библиотеке языка программирования бота существует ряд функций (операций) значением которых являются так называемые объекты. Объект это особое значение у которого могут быть встроенные свойства и операции или методы. Набор этих свойств и методов определяется типом объекта. Для доступа к свойствам или методам объектов используется оператор точка "."
...
Существует три типа встроенных объектов являющихся коллекциями произвольных элементов
Кортежи
Кортеж или tuple это неизменяемая упорядоченная коллекция произвольных элементов. Создать кортеж можно с помощью круглых скобок:
...
Метод | Описание | Пример | Результат |
---|---|---|---|
count() | Получение количества элементов кортежа | (1, 2, 3).count() | 3 |
first() | Получение первого элемента кортежа | (1, 2, 3).first() | 1 |
last() | Получение последнего элемента кортежа | (1, 2, 3).last() | 3 |
has(index) | Возвращает true, если кортеж содержит элемент с указанным порядковым номером и false в противном случае | (1, 2, 3).has(0) | true false |
get(index) | Возвращает элемент кортежа по его порядковому номеру или nil если такого элемента нет | (1, 2, 3).get(1) | 2 |
contains(item) | Возвращает true, если кортеж содержит элемент item и false в противном случае | (1, 2, 3).get(3) | true |
index(item) | Возвращает порядковый номер элемента item, либо -1 если такого элемента нет | (1, 2, 3).index(3) | 2 |
equals(other) | Возвращает true, если other представляет собой точно такой же кортеж (т.е. кортеж содержащий те же самые элементы) и false в противном случае | ('a', 'b').equals(('a', 'b')) | true false |
hash() | Возвращает строку, представляющую собой хэш кортежа (значение уникально идентифицирующее содержимое кортежа) | ('a', true).hash() | bb2fadd01f7d0ac9864dc963a61f653f |
Списки
Список или list это изменяемая упорядоченная коллекция произвольных элементов. Создать список можно с помощью квадратных скобок:
...
Метод | Описание | Пример | Результат |
---|---|---|---|
count() | Получение количества элементов списка | [1, 2, 3].count() | 3 |
first() | Получение первого элемента списка | [1, 2, 3].first() | 1 |
last() | Получение последнего элемента списка | [1, 2, 3].last() | 3 |
has(index) | Возвращает true, если список содержит элемент с указанным порядковым номером и false в противном случае | [1, 2, 3].has(0) | true false |
get(index) | Возвращает элемент списка по его порядковому номеру или nil если такого элемента нет | [1, 2, 3].get(1) | 2 |
contains(item) | Возвращает true, если список содержит элемент item и false в противном случае | [1, 2, 3].contains(1) | true |
index(item) | Возвращает порядковый номер элемента item, либо -1 если такого элемента нет | [1, 2, 3].index(1) | 0 |
toTuple() | Возвращает кортеж состоящий из элементов данного списка | [1, 2, 3].toTuple() | (1, 2, 3) |
clear() | Удаляет все элементы списка | $x = [1, 2, 3] | $x содержит пустой список [] |
reverse() | Меняет порядок следования элементов списка на обратный | [1, 2, 3].reverse() | [3, 2, 1] |
append(item) | Добавляет переданное значение item в конец списка | [1, 2, 3].append(4) | [1, 2, 3, 4] |
prepend(item) | Добавляет переданное значение item в начало списка | [1, 2, 3].prepend(0) | [0, 1, 2, 3] |
shift() | Удаляет и возвращает первый элемент списка | $x = [1, 2, 3] | $y будет содержать 1, а $x станет равным [2, 3] |
pop() | Удаляет и возвращает последний элемент списка | $x = [1, 2, 3] | $y будет содержать 3, а $x станет равным [1, 2] |
set(index, item) | Добавляет значение в указанную позицию списка. Если позиция лежит за пределами списка, то он будет расширен нулевыми значениямидо нужного размера. | $x = [1, 2, 3] | $y содержит [1, 0, 3] |
remove(index) | Удаляет элемент списка в указанной позиции и возвращает его значение | $x = [1, 2, 3] | $y будет содержать 2, а $x станет равным [1, 3] |
equals(other) | Возвращает true, если other представляет собой точно такой же список (т.е. список содержащий те же самые элементы) и false в противном случае | ['a', 'b'].equals(['a', 'b']) | true false |
hash() | Возвращает строку, представляющую собой хэш списка (значение уникально идентифицирующее содержимое списка) | ['a', true].hash() | bb2fadd01f7d0ac9864dc963a61f653f |
Ассоциативные массивы (словари)
Ассоциативный массив или словарь (map) это изменяемая упорядоченная поллекция произвольных пар ключ/значение. Создаётся словарь с помощью фигурных скобок:
...
Метод | Описание | Пример | Результат |
---|---|---|---|
count() | Получение количества элементов словаря | {1: 'a', 2: 'b', 3: 'c'}.count() | 3 |
clear() | Удаление всех элементов словаря | $x = {true: false, 'b': true} | $x станет содержать пустой словарь |
reverse() | Меняет порядок следования элементов словаря на обратный | {'a': 1, 'b': 2, 'c': 3}.reverse() | {'c': 3, 'b': 2, 'a': 1} |
values() | Возвращает список состоящий из всех значений словаря | {'a': 1, 'b': 2, 'c': 3}.values() | [1, 2, 3] |
keys() | Возвращает список состоящий из всех ключей словаря | {'a': 1, 'b': 2, 'c': 3}.keys() | ['a', 'b', 'c'] |
firstKey() | Получение первого ключа словаря | {'a': 1, 'b': 2, 'c': 3}.firstKey() | 'a' |
lastKey() | Получение последнего ключа словаря | {'a': 1, 'b': 2, 'c': 3}.lastKey() | 'c' |
first() | Получение первого элемента словаря | {'a': 1, 'b': 2, 'c': 3}.first() | 1 |
last() | Получение последнего элемента словаря | {'a': 1, 'b': 2, 'c': 3}.last() | 3 |
contains(item) | Возвращает true, если словарь содержит элемент item и false в противном случае | {'a': 1, 'b': 2, 'c': 3}.contains(2) | true |
key(item) | Возвращает ключ соответствующий значению item или nil в противном случае | {'a': 1, 'b': 2, 'c': 3}.key(3) | c |
has(key) | Возвращает true, если элемент с указанным ключём сущеcтвует и false в противном случае | {'a': 1, 'b': 2, 'c': 3}.has('a') | true |
get(key) | Возвращает элемент словаря по его ключу или nil если такого элемента нет | {'a': 1, 'b': 2, 'c': 3}.get('b') | 2 |
set(key, item) | Устанавливает элемент словаря с заданным ключём | $x = {1: true, 2: nil} | $x будет содрежать {1: true, 2: false} |
remove(key) | Удаляет элемент словаря по ключу и возвращает его значение | $x = {'a': 1, 'b': 2} | $y будет содержать 1, а $x станет равным {'b': 2} |
equals(other) | Возвращает true, если other представляет собой точно такой же словарь (т.е. ловарь содержащий те же самые ключи и значения) и false в противном случае | {'a': 'b'}.equals(['a': 'b']) | true false |
hash() | Возвращает строку, представляющую собой хэш словаря (значение уникально идентифицирующее содержимое словаря) | {'a': true}.hash() | bb2fadd01f7d0ac9864dc963a61f653f |
Специальное значение 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 |
Побитовые операции
Это отдельный класс операций предназначенных для выполнения над битовыми представлениями целых чисел.
...
Тип | Значение | Результат |
---|---|---|
NIL | nil | 0 |
Логический | true | 1 |
Логический | false | 0 |
Строка | "" | 0 |
Строка | "123.5" | 123.5 |
Строка | "abc" | ошибка |
Объект | любой | ошибка |
Логические операции
Логические операции предназначены для работы с булевыми значениями. Если значение не является булевым, то произойдёт попытка его преобразования в булевое значение (см. ниже).
...
Тип | Значение | Результат |
---|---|---|
NIL | nil | false |
Число | 0 | false |
Число | любое ненулевое | true |
Строка | "" | false |
Строка | любая непустая | true |
Объект | любой | true |
Операции со строками
Есть только одна операция для работы со строками. Это сложение или конкатенация строк:
...
Тип | Значение | Результат |
---|---|---|
NIL | nil | "" |
Число | 123.45 | "123.45" |
Логический | true | "true" |
Логический | false | "false" |
Объект | любой | сериализация в строку |
Операции сравнения
Операции сравнения выполняются над любыми типами данных и результатом их вычисления являются булевые значения.
Пример | Результат |
---|---|
$a == $b | true если $a тождественно равно $b |
$a != $b | true если $a тождественно не равно $b |
$a > $b | true если $a больше $b |
$a >= $b | true если $a больше или равно $b |
$a < $b | true если $a меньше $b |
$a <= $b | true если $a меньше или равно $b |
Операции с коллекциями
Для встроенных типов объектов tuple, list и map доступна одна операция объединения:
Пример | Результат |
---|---|
(1, 2) + (3, 4) | (1, 2, 3, 4) |
['a', 'b'] + ['c'] | ['a', 'b', 'c'] |
{'a': 0, 'b': 2} + {'a': 1, 'c': 3} | {'a': 1, 'b': 2, 'c': 3} |
Операции присваивания
Операции присваивания повзоляют назначать переменным какое-либо значение:
...
Пример | Результат присваивания | Значение выражения присваивания |
---|---|---|
($x, $y, $z) = (1, 2, 3) | $x = 1 | (1, 2, 3) |
[$x, $y] = ($y, $x) | $x = $y | [$y, $x] |
{'a': $x, 'b': $y} = {'b': true, 'a': false} | $x = false | {'a': false, 'b': true} |
($x, $y, $z) += [1, 2, 3] | $x = $x + 1 | ($x + 1, $y + 1, $z + 1) |
{3: $x, 7: $y} *= (2, 3) | $x = $x * 2 | {3: $x * 2, 7: $y * 3} |
Функции
Основными строительными элементами выражений в блоке операций являются вызовы функций. Функция это некоторая часть функциональности бота. Например, с помощью функций можно оперировать датой и временем, вычислять более сложные арифметические операции, преобразовывать строку текста в намерения используя сервис NLU, работать с очередью сообщений клиента и т.д.
...