На этой странице:
Предупреждение |
---|
| BPL-операции работают только в чатах и во входящих звонках. Для тестирования сценариев, использующих BPL-операции, используйте чат в виджете. Как создать тестовый виджет: Создание тестового виджета |
В блоке операций/выражений можно указывать произвольное количество операций которые должен вычислить бот в процессе своей работы. Операции представляют собой выражения записанные с помощью подмножества языка программирования разговорных ботов описание которого содержится ниже.
Структура операцийВсе операции бота в пределах одного блока операций представляют собой одно или несколько выражений на языке программирования ботов. Выражения отделяются друг от друга необязательным символом ";", либо символом перевода строки (началом новой строки). Каждое выражение имеет значение. Это значит что выражения могут быть составными. КомментарииПри записи выражений можно указывать комментарии - участки программы которые не участвуют в вычислениях, а выполняют лишь информационную функцию. Есть два вида комментариев: - Однострочные. Такие комментарии начинаются с двух слэшей // и заканчиваются окончанием строки.
- Многострочные. Начало многострочного комментарии начинается с /* и заканчивается */
Пример комментариев: Блок кода |
---|
| // Это однострочный комментарий
$x = time()
/**
* А это уже
* многострочный
* комментарий
*/
say("Time is " + $x) |
ПеременныеДля хранения данных в сценариях ботов применяются переменные. Переменная представляет собой именованный участок памяти бота. Она создаётся при первом её использовании в каком-либо блоке операций. При этом значением по умолчанию для всех переменных является nil. Существуют три вида переменных, различающихся своей областью видимости: - Переменные видимые в пределах одного модуля в одном потоке. Доступны для чтения и записи. Названия таких переменных начинаются с $. Такие переменные удобно использовать для хранения промежуточных операций и вычислений.
- Переменные видимые в пределах одного модуля в разных потоках. Доступны для чтения и записи. Названия переменных уровня модуля начинаются с #. Поскольку такие переменные видны во всех потоках бота их удобно использовать для взаимодействия между потоками.
- Глобальные переменные или переменные окружения. Автоматически задаваемые переменные, которые видны во всех потоках всех модулей бота. Эти переменные доступны только для чтения и хранят информацию о глобальном контексте работы бота. Их имена начинаются с символа @
Примеры записей переменных разных видов: Блок кода |
---|
| // Переменные $p и $r доступны только в потоке в котором они определены
$p = 2 * 3.14 * $r
// Эта переменная доступна во всех потоках в пределах текущего модуля
// (модуля в котором находится блок операций в котором определена переменная).
#count = queue.size()
// @communicationType глобальная переменная только для чтения. Доступна отовсюду.
$isChat = @communicationType == "TEXT" |
Имена переменных могут содержать только цифры, английские и русские буквы, а также символ подчёркивания. Т.е. вы не можете назвать переменную каким-то словом содержащим пробел или символ отличный от русского и английского языков. Тем не менее существует способ задать любое название. Для этого необходимо заключить название переменной в круглые скобки: Блок кода |
---|
| $('日本') = 123 // Создали переменную c именем 日本
$x = $('日本') // $x теперь равна 123
$(math.rand(1, 2)) = 0 // Динамически создаём переменную с именем 1 или 2 и присваиваем ей значение 0 |
Переменные переменныхЯзык выражений бота позоляет динамически вычислять имя переменной в процессе работы бота. Это в частности означает что значением одной переменной может быть имя другой переменной. Или, в более общем случае, именем переменной может быть любое выражение, значением которого является строка. В примере ниже мы определяем три переменные содержащие названия цветов. Затем мы определяем случайно число от 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)) |
Существует три типа встроенных объектов являющихся коллекциями произвольных элементов КортежиКортеж или tuple это неизменяемая упорядоченная коллекция произвольных элементов. Создать кортеж можно с помощью круглых скобок: Блок кода |
---|
| $items = (1, 2, 2) // Кортеж из трёх элементов
$items = ('a',) // Кортеж из одного элемента. Запятая необходима чтобы отличать создание кортежа от просто круглых скобок.
$items = () // Кортеж не содержащий ни одного элемента (пустой кортеж) |
Для работы с кортежами доступны следующие методы: Метод | Описание | Пример | Результат |
---|
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) (1, 2, 3).has(3) | true false | get(index) | Возвращает элемент кортежа по его порядковому номеру или nil если такого элемента нет | (1, 2, 3).get(1) (1, 2, 3).get(3) | 2 nil | contains(item) | Возвращает true, если кортеж содержит элемент item и false в противном случае | (1, 2, 3).contains(3) (1, 2, 3).contains(0) | true false | index(item) | Возвращает порядковый номер элемента item, либо -1 если такого элемента нет | (1, 2, 3).index(3) (1, 2, 3).index(0) | 2 -1 | equals(other) | Возвращает true, если other представляет собой точно такой же кортеж (т.е. кортеж содержащий те же самые элементы) и false в противном случае | ('a', 'b').equals(('a', 'b')) ('a', 'b').equals(('b', 'a')) | true false | hash() | Возвращает строку, представляющую собой хэш кортежа (значение уникально идентифицирующее содержимое кортежа) | ('a', true).hash() | bb2fadd01f7d0ac9864dc963a61f653f |
СпискиСписок или list это изменяемая упорядоченная коллекция произвольных элементов. Создать список можно с помощью квадратных скобок: Блок кода |
---|
| $items = [1, 2, 2] // Список из трёх элементов
$items = ['a'] // Список из одного элемента
$items = [] // Список не содержащий ни одного элемента (пустой список) |
Для работы со списками доступны следующие методы: Метод | Описание | Пример | Результат |
---|
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) [1, 2, 3].has(3) | true false | get(index) | Возвращает элемент списка по его порядковому номеру или nil если такого элемента нет | [1, 2, 3].get(1) [1, 2, 3].get(3) | 2 nil | contains(item) | Возвращает true, если список содержит элемент item и false в противном случае | [1, 2, 3].contains(1) [1, 2, 3].contains(0) | true false | index(item) | Возвращает порядковый номер элемента item, либо -1 если такого элемента нет | [1, 2, 3].index(1) [1, 2, 3].index(0) | 0 -1 | toTuple() | Возвращает кортеж состоящий из элементов данного списка | [1, 2, 3].toTuple() | (1, 2, 3) | clear() | Удаляет все элементы списка | $x = [1, 2, 3] $x.clear() | $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 = $x.shift() | $y будет содержать 1, а $x станет равным [2, 3] | pop() | Удаляет и возвращает последний элемент списка | $x = [1, 2, 3] $y = $x.pop() | $y будет содержать 3, а $x станет равным [1, 2] | set(index, item) | Добавляет значение в указанную позицию списка. Если позиция лежит за пределами списка, то он будет расширен нулевыми значениямидо нужного размера. | $x = [1, 2, 3] $y = $x.set(1, 0) $z = $x.set(5, 'a') | $y содержит [1, 0, 3] $z содержит [1, 2, 3, nil, nil, 'a'] | remove(index) | Удаляет элемент списка в указанной позиции и возвращает его значение | $x = [1, 2, 3] $y = $x.remove(1) | $y будет содержать 2, а $x станет равным [1, 3] | equals(other) | Возвращает true, если other представляет собой точно такой же список (т.е. список содержащий те же самые элементы) и false в противном случае | ['a', 'b'].equals(['a', 'b']) ['a', 'b'].equals(['b', 'a']) | true false | hash() | Возвращает строку, представляющую собой хэш списка (значение уникально идентифицирующее содержимое списка) | ['a', true].hash() | bb2fadd01f7d0ac9864dc963a61f653f |
Ассоциативные массивы (словари)Ассоциативный массив или словарь (map) это изменяемая упорядоченная коллекция произвольных пар ключ/значение. Создаётся словарь с помощью фигурных скобок: Блок кода |
---|
| $items = {'a': 1, 'b': 2, 'c': 3} // Словарь из трёх элементов
$items = {1: true} // Cловарь из одного элемента
$items = {} // Словарь не содержащий ни одного значения (пустой словарь) |
Для работы со словарями доступны следующие методы: Метод | Описание | Пример | Результат |
---|
count() | Получение количества элементов словаря | {1: 'a', 2: 'b', 3: 'c'}.count() | 3 | clear() | Удаление всех элементов словаря | $x = {true: false, 'b': true} $x.clear() | $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) {'a': 1, 'b': 2, 'c': 3}.contains(4) | true false | key(item) | Возвращает ключ соответствующий значению item или nil в противном случае | {'a': 1, 'b': 2, 'c': 3}.key(3) {'a': 1, 'b': 2, 'c': 3}.key(4) | c nil | has(key) | Возвращает true, если элемент с указанным ключом сущеcтвует и false в противном случае | {'a': 1, 'b': 2, 'c': 3}.has('a') {'a': 1, 'b': 2, 'c': 3}.has('d') | true false | get(key) | Возвращает элемент словаря по его ключу или nil если такого элемента нет | {'a': 1, 'b': 2, 'c': 3}.get('b') {'a': 1, 'b': 2, 'c': 3}.get('d') | 2 nil | set(key, item) | Устанавливает элемент словаря с заданным ключом | $x = {1: true, 2: nil} $x.set(2, false) | $x будет содрежать {1: true, 2: false} | remove(key) | Удаляет элемент словаря по ключу и возвращает его значение | $x = {'a': 1, 'b': 2} $y = $x.remove('a') | $y будет содержать 1, а $x станет равным {'b': 2} | equals(other) | Возвращает true, если other представляет собой точно такой же словарь (т.е. словарь содержащий те же самые ключи и значения) и false в противном случае | {'a': 'b'}.equals(['a': 'b']) {'a': 'b'}.equals(['b': 'a']) | 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 |
Побитовые операцииЭто отдельный класс операций предназначенных для выполнения над битовыми представлениями целых чисел. Пример | Результат |
---|
~$a | Устанавливаются те биты, которые не установлены в $a, и наоборот | $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" | ошибка | Объект | любой | ошибка |
Логические операцииЛогические операции предназначены для работы с булевыми значениями. Если значение не является булевым, то произойдёт попытка его преобразования в булевое значение (см. ниже). Пример | Результат |
---|
!$a | true, если $a равно false и false в противном случае | $a && $b | true, если $a и $b true, false в противном случае | $a || $b | false, если $a и $b false, true в противном случае |
Таблица преобразования других типов данных в булевое значение: Тип | Значение | Результат |
---|
NIL | nil | false | Число | 0 | false | Число | любое ненулевое | true | Строка | "" | false | Строка | любая непустая | true | Объект | любой | true |
Операции со строкамиЕсть только одна операция для работы со строками. Это сложение или конкатенация строк: Пример | Результат |
---|
"a" + "b" | "ab" |
Если первый аргумент оператора "+" не является строкой, то будет выполняться арифметическая операция сложения. Если второй аргумент операции конкатенации не является строкой, то он будет преобразован в строку согласно следующей таблицы преобразования: Тип | Значение | Результат |
---|
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} |
Операции присваиванияОперации присваивания позволяют назначать переменным какое-либо значение: Пример | Результат |
---|
$a = 123 | $a содержит 123 | $a += 1 | $a = $a + 1 | $a -= 1 | $a = $a - 1 | $a *= 2 | $a = $a * 2 | $a /= 2 | $a = $a / 2 | $a \= 2 | $a = $a \ 2 | $a %= 5 | $a = $a % 5 | $a **= 3 | $a = $a ** 3 | $a &= 1 | $a = $a & 1 | $a |= 3 | $a = $a | 3 | $a ^= 4 | $a = $a ^ 4 |
Кроме присваивания значения одной переменной есть возможность присвоить значение сразу нескольким переменным: Пример | Результат присваивания | Значение выражения присваивания |
---|
($x, $y, $z) = (1, 2, 3) | $x = 1 $y = 2 $z = 3 | (1, 2, 3) | [$x, $y] = ($y, $x) | $x = $y $y = $x | [$y, $x] | {'a': $x, 'b': $y} = {'b': true, 'a': false} | $x = false $y = true | {'a': false, 'b': true} | ($x, $y, $z) += [1, 2, 3] | $x = $x + 1 $y = $y + 2 $z = $z + 3 | ($x + 1, $y + 1, $z + 1) | {3: $x, 7: $y} *= (2, 3) | $x = $x * 2 $y = $y * 3 | {3: $x * 2, 7: $y * 3} |
ФункцииОсновными строительными элементами выражений в блоке операций являются вызовы функций. Функция это некоторая часть функциональности бота. Например, с помощью функций можно оперировать датой и временем, вычислять более сложные арифметические операции, преобразовывать строку текста в намерения используя сервис NLU, работать с очередью сообщений клиента и т.д. Чтобы вызвать функцию нужно указать её имя, затем в круглых скобках перечислить через запятую её параметры. Имена большинства функций состоят из двух частей разделяемых точкой: названия модуля и собственно названия функции. Блок кода |
---|
| $number = math.rand(5, 10) // Получаем случайное число от 5 до 10. math - название модуля, rand - название функции |
Также как и в случае методов объектов имена функций могут динамически вычисляться в процессе выполнения сценария бота. Блок кода |
---|
| $funcIdx = math.rand(0, 1) // Получаем случайное число 0 или 1 которое будет индексом названия функции в кортеже
$number = math.(('min', 'max').get($funcIdx))(3, 7) // Получаем название функции min или max и далее вызываем её. Таким образом мы вычисляем случайным образом либо минимальное либо максимальное значение |
|