Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Якорь
Top
Top

...

На этой странице:В блоке операций/выражений можно указывать произвольное количество операций которые должен вычислить бот в процессе своей работы. Операции представляют собой выражения записанные с помощью подмножества языка программирования разговорных ботов описание которого содержится ниже.

Оглавление
classbpl

Структура операций

Все операции бота в пределах одного блока операций представляют собой одно или несколько выражений на языке прграммирования ботов. Выражения отделяются друг от друга необязательным символом ";", либо символом перевода строки (началом новой строки). Каждое выражение имеет значение. Это значит что выражения могут быть составными

Комментарии

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

  • Однострочные. Такие комментарии начинаются с двух слэшей // и заканчиваются окончанием строки.
  • Многострочные. Начало многострочного комментарии начинается с /* и заканчивается */

Пример комментариев:

Блок кода
languagetext
// Это однострочный комментарий
$x = time()

/**
 * А это уже
 * многострочный
 * комментарий
 */
say("Time is " + $x)

Переменные

Для хранения данных в сценариях ботов применяются переменные. Переменная представляет собой именованный участок памяти бота. Она создаётся при первом её использовании в каком-либо блоке операций. При этом значением по умолчанию для всех переменных является nil.

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

  • Переменные видимые в пределах одного модуля в одном потоке. Доступны для чтения и записи. Названия таких переменных наяинаются с $. Такие переменные удобно использовать для хранения промежуточных операций и вычислений.
  • Переменные видимые в пределах одного модуля в разных потоках. Доступны для чтения и записи. Названия переменных уровня модуля начинаются с #. Поскольку такие переменные видны во всех потоках бота их удобно использовать для взаимодействия между потоками. 
  • Глобальные переменные или переменные окружения. Автоматически задаваемые переменные, которые видны во всех потоках всех модулей бота. Эти переменные доступны только для чтения и хранят информацию о глобальном контексте работы бота. Их имена начинаются  с символа @

Примеры записей переменных разных видов:

Блок кода
languagetext
// Переменные $p и $r доступны только в потоке в котором они определены
$p = 2 * 3.14 * $r

// Эта переменная доступна во всех потоках в пределах текущего модуля
// (модуля в котором находится блок операций в котором определена переменная).
#count = queue.size()

// @communicationType глобальная переменная только для чтения. Доступна отовсюду.
$isChat = @communicationType == "TEXT"

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

Блок кода
languagetext
$('日本') = 123         // Создали переменную c именем 日本
$x = $('日本')          // $x теперь равна 123
$(math.rand(1, 2)) = 0 // Динамически создаём переменную с именем 1 или 2 и присваеваем ей значение 0

Переменные переменных

Язык выражений бота позоляет динамически вычислять имя переменной в процессе работы бота. Это в частности означает что значением одной переменной может быть имя другой переменной. Или, в более общем случае, именем переменной может быть любое выражение, значением которого является строка.

В примере ниже мы определяем три переменные содержащие названия цветов. Затем мы определяем случайно число от 1 до 3 и далее формируем название одной из переменных с тем чтобы узнать значение случайного цвета.

Блок кода
languagetext
// Создадим три переменные с именами x1, x2 и x3
$x1 = "red"
$x2 = "blue"
$x3 = "green"

// Случайное число от 1 до 3
$n = math.rand(1, 3)

// Получаем цвет динамически сформировав имя переменной с цветом и взяв её значение 
$color = $("x" + $n)

Можно также использовать значения переменных разных типов:

Блок кода
languagetext
// $x содержит название переменной #y
$x = "y"

// #y содержит название глобальной переменной communicationType
#y = "communicationType"

// Вычисляется так @#$x -> @#("y") -> @#y -> @("communicationType") -> @communicationType
$communicationType = @#$x

Типы данных

Существует три примитивных типа данных один объектный тип и специальное значение nil:

Числа

Все числа трактуются как вещественные знаковые с плавающей точкой. Минимальное и максимальное значение определяется той вычислительной средой в которой работает интерпретатор языка выражений.

Строки

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

...

...

Предупреждение
titleВнимание

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

HTML
<a href="https://confluence.twin24.ai/pages/viewpage.action?pageId=137790002" target="_blank">Создание тестового виджета</a>.

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

Структура операций

Все операции бота в пределах одного блока операций представляют собой одно или несколько выражений на языке программирования ботов. Выражения отделяются друг от друга необязательным символом ";" либо символом перевода строки (началом новой строки). Каждое выражение имеет значение. Это значит, что выражения могут быть составными.

Комментарии

При записи выражений можно указывать комментарии – участки программы, которые не участвуют в вычислениях, а выполняют лишь информационную функцию. Есть два вида комментариев:

  • Однострочные. Такие комментарии начинаются с символов // и заканчиваются окончанием строки.
  • Многострочные. Начало многострочного комментария начинается с символов /* и заканчивается символами */.
Блок кода
languagephp
themeDJango
firstline1
titleПример комментариев
linenumberstrue
// Это однострочный комментарий
$x = time()

/**
 * А это уже
 * многострочный
 * комментарий
 */
say("Time is " + $x)

Переменные

Для хранения данных в сценариях ботов применяются переменные. Переменная представляет собой именованный участок памяти бота. Она создаётся при первом своем использовании в каком-либо блоке операция. При этом значением по умолчанию для всех переменных является nil.

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

  • Переменные, видимые в пределах одного модуля в одном потоке.
    Доступны для чтения и записи. Названия таких переменных начинаются с символа $. Такие переменные удобно использовать для хранения значений промежуточных операций и вычислений.
  • Переменные, видимые в пределах одного модуля в разных потоках.
    Доступны для чтения и записи. Названия переменных уровня модуля начинаются с символа #. Поскольку такие переменные видны во всех потоках бота их удобно использовать для взаимодействия между потоками. 
  • Глобальные переменные или переменные окружения.
    Автоматически задаваемые переменные, которые видны во всех потоках всех модулей бота. Эти переменные доступны только для чтения и хранят информацию о глобальном контексте работы бота. Их имена начинаются с символа @.
Блок кода
languagephp
themeDJango
firstline1
titleПримеры записей переменных разных видов
linenumberstrue
// Переменные $p и $r доступны только в потоке, в котором они определены
$p = 2 * 3.14 * $r

// Эта переменная доступна во всех потоках в пределах текущего модуля
// (модуля, в котором находится блок операций, в котором определена переменная).
#count = queue.size()

// @communicationType глобальная переменная только для чтения. Доступна везде.
$isChat = @communicationType == "TEXT"

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

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
$('日本') = 123         // Создали переменную c именем 日本
$x = $('日本')          // $x теперь равна 123
$(math.rand(1, 2)) = 0 // Динамически создаём переменную с именем 1 или 2 и присваиваем ей значение 0

Переменные переменных

Язык выражений бота позволяет вычислять имя переменной динамически в процессе работы бота. Это означает, что значением одной переменной может быть имя другой переменной или любое выражение, значением которого является строка.

В примере ниже мы определяем три переменные, содержащие названия цветов. Затем мы определяем случайно число от 1 до 3 и далее формируем название одной из переменных с тем, чтобы узнать значение случайного цвета.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
// Создадим три переменные с именами x1, x2 и x3
$x1 = "red"
$x2 = "blue"
$x3 = "green"

// Случайное число от 1 до 3
$n = math.rand(1, 3)

// Получаем цвет динамически сформировав имя переменной с цветом и взяв её значение 
$color = $("x" :: $n)

Можно также использовать значения переменных разных типов.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
// $x содержит название переменной #y
$x = "y"

// #y содержит название глобальной переменной communicationType
#y = "communicationType"

// Вычисляется так @#$x -> @#("y") -> @#y -> @("communicationType") -> @communicationType
$communicationType = @#$x

Типы данных

Существует три примитивных типа данных, один объектный тип и специальное значение nil.

Числа

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

Строки

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

ПоследовательностьЗначение
\nПеревод строки
\rВозврат каретки
\tГоризонтальная табуляция
\v 
\"Двойная кавычка

В одинарных кавычках все символы трактуются как есть за исключением последовательности символов \', которая означает символ одинарной кавычки.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
// Следующая команда выведет в чат фразу из двух строк
// Привет
// "Медвед!"
say("Привет\n\"Медвед!\"")

// Выведет в чат фразу Привет\n'Медвед!'
say('Привет\n\'Медвед!\'')

Булевы (логические) значения

Константы true и false трактуются как булевы, т.е. такие значения, у которых есть только два состояния – истина и ложь. Булевы значения удобно применять в выражениях условного блока.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
$x = true  // $x содержит ИСТИНА
$y = !$x   // $y содержит ЛОЖЬ

Объекты

В стандартной библиотеке языка программирования бота существует ряд функций (операций), значением которых являются так называемые объекты. Объект – это особое значение, у которого могут быть встроенные свойства и операции или методы. Набор этих свойств и методов определяется типом объекта. Для доступа к свойствам или методам объектов используется оператор точка ".".

Например, с помощью следующего кода можно получить первое сообщение клиента, которое является объектом ClientMessage и далее получить свойство message (текст сообщения) этого объекта.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
// $first содержит значение объекта ClientMessage 
$first = queue.first()

// Получаем значение свойства message
$firstMessage = $first.message

Свойства и методы объектов (также как и значения переменных) могут быть вычисляемыми.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
$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 – это неизменяемая, упорядоченная коллекция произвольных элементов. Создать кортеж можно с помощью круглых скобок.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
$items = (1, 2, 2) // Кортеж из трёх элементов.
$items = ('a',)    // Кортеж из одного элемента. Запятая необходима, чтобы отличать создание кортежа от просто круглых скобок.
$items = ()        // Кортеж не содержащий ни одного элемента (пустой кортеж).

Для работы с кортежами доступны следующие методы.


МетодОписаниеПримерРезультат
1
count()
Получение количества элементов кортежа
(1, 2, 3).count()
3
2
first()
Получение первого элемента кортежа
(1, 2, 3).first()
1
3
last()
Получение последнего элемента кортежа
(1, 2, 3).last()
3
4
has(index)
Возвращает true, если кортеж содержит элемент с указанным порядковым номером, и false в противном случае
(1, 2, 3).has(0)
(1, 2, 3).has(3)
true
false
5
get(index)
Возвращает элемент кортежа по его порядковому номеру или nil, если такого элемента нет
(1, 2, 3).get(1)
(1, 2, 3).get(3)

2
nil

6contains(item)Возвращает 1, если кортеж содержит элемент item, и ничего (void) в противном случае.
(1, 2, 3).contains(3)
(1, 2, 3).contains(0)

true
false

7index(item)Возвращает порядковый номер элемента item либо -1, если такого элемента нет
(1, 2, 3).index(3)
(1, 2, 3).index(0)

2
-1

8
equals(other)
Возвращает true, если other представляет собой точно такой же кортеж (т.е. кортеж, содержащий те же самые элементы), и false в противном случае
('a', 'b').equals(('a', 'b'))
('a', 'b').equals(('b', 'a'))
true
false
9
hash()
Возвращает строку, представляющую собой хэш кортежа (значение, уникально идентифицирующее содержимое кортежа)
('a', true).hash()
bb2fadd01f7d0ac9864dc963a61f653f
10copy()Создаёт поверхностную копию кортежа (т.е. не копирует коллекции внутри кортежа).$list = ["a", "b"]
$copy = (1, 2, $list).copy()
$copy.get(2).append("c")

$list будет равен
["a", "b", "c"]
$copy будет равен
(1, 2, ["a", "b", "c"])

11deepCopy()Создаёт полную копию кортежа.

$list = ["a", "b"]
$copy = (1, 2, $list).deepCopy()
$copy.get(2).append("c")

$list будет равен
["a", "b"]
$copy будет равен
(1, 2, ["a", "b", "c"])

12merge(collection)Возвращает новый кортеж полученный из слияния текущего кортежа с коллекций (другим кортежем, списком или словарём)

(1, 2, 3).merge((4, 5))
(1, 2, 3).merge([3, 4])
(1, 2, 3).merge({"a": 1, "b": 2})

(1, 2, 3, 4, 5)
(1, 2, 3, 3, 4)
(1, 2, 3, 1, 2)

Списки

Список или list – это изменяемая, упорядоченная коллекция произвольных элементов. Создать список можно с помощью квадратных скобок.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
$items = [1, 2, 2] // Список

В одинарных кавычках все символы тарктуются как есть за исключением последовательности \' которая означет символ одинарной кавычки.

Блок кода
languagetext
// Следуюущая команда выведет в чат фразу из двух строк
// Привет
// "Медвед!"
say("Привет\n\"Медвед!\"")

// Выведет в чат фразу Привет\n'Медвед!'
say('Привет\n\'Медвед!\'')

Булевые (логические) значения

Константы true и false трактуются как булевые, т.е. такие значения у которых есть только два состояния - истина и ложь. Булевые значения удобно применять в выражении условного блока.

Блок кода
languagetext
$x = true  // $x содержит ИСТИНА
$y = !$x   // $y содержит ЛОЖЬ

Объекты

В стандартной библиотеке языка программирования бота существует ряд функций (операций) значением которых являются так называемые объекты. Объект это особое значение у которого могут быть встроенные свойства и операции или методы. Набор этих свойств и методов определяется типом объекта. Для доступа к свойствам или методам объектов используется оператор точка "."

Например, следущий код получает первое сообщение клиента которое является объектом ClientMessage и далее берёт свойство message (текст сообщения) этого объекта:

Блок кода
languagetext
// $first содержит значение объекта ClientMessage 
$first = queue.first()

// Получаем значение совойства message
$firstMessage = $first.message

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

Блок кода
languagetext
$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 это неизменяемая упорядоченная коллекция произвольных элементов. Создать кортеж можно с помощью круглых скобок:

Блок кода
languagetext
$items = (1, 2, 2) // Кортеж из трёх элементов
$items = (['a',)]     // КортежСписок из одного эелемента. Запятая необходима чтобы отличать создание кортежа от просто круглых скобок.элемента
$items = ()[]        // КортежСписок не содержащий ни одного элемента (пустой кортежсписок)

Для работы с кортежами со списками доступны следующие методы:.

кортежа() кортежа() кортежа() кортеж ()() кортежа ()() кортеж ()get3()get, )index3 .index0
МетодОписаниеПримерРезультат
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(
)

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 это изменяемая упорядоченная коллекция произвольных элементов. Создать список можно с помощью квадратных скобок:

...

languagetext
Удаляет все элементы списка
$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 = 

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

.count().has(0)
2, .has3
МетодОписаниеПримерРезультат
count()
Получение количества элементов списка
[1, 2, 3]
3
first()
Получение первого элемента списка
[1, 2, 3].first()
1
last()
Получение последнего элемента списка
[1, 2, 3].last()
3
has(index)
Возвращает true, если список содержит элемент с указанным порядковым номером и false в противном случае

$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
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) это изменяемая упорядоченная поллекция произвольных пар ключ/значение. Создаётся словарь с помощью фигурных скобок:

...

languagetext
Возвращает true, если other представляет собой точно такой же список (т.е. список, содержащий те же самые элементы), и false в противном случае
['a', 'b'].equals(['a', 'b'])
['a', 'b'].equals(['b', 'a'])
true
false
hash()
Возвращает строку, представляющую собой хэш списка (значение, уникально идентифицирующее содержимое списка)
['a', true].hash()
bb2fadd01f7d0ac9864dc963a61f653f
copy()Создаёт поверхностную копию списка (т.е. не копирует коллекции внутри списка).$list = ["a", "b"]
$copy = [1, 2, $list].copy()
$copy.get(2).append("c")
$list будет равен
["a", "b", "c"]
$copy будет равен
[1, 2, ["a", "b", "c"]]
deepCopy()Создаёт полную копию списка.$list = ["a", "b"]
$copy = [1, 2, $list].deepCopy()
$copy.get(2).append("c")
$list будет равен
["a", "b"]
$copy будет равен
[1, 2, ["a", "b", "c"]]
merge(collection)Сливает текущий список с коллекций (другим кортежем, списком или словарём) и возвращает его.

["a", "b"].merge((1, 2))
["a", "b"].merge(["a", "c"])
["a", "b"].merge({"a": 1, "b": 2})

["a", "b", 1, 2]
["a", "b", "a", "c"]
["a", "b", 1, 2]

Ассоциативные массивы (словари)

Ассоциативный массив или словарь (map) – это изменяемая, упорядоченная коллекция произвольных пар ключ/значение. Создаётся словарь с помощью фигурных скобок.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstrue
$items = {'a': 1, 'b': 2, 'c': 3} // Словарь из трёх элементов
$items = {'a': 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

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

{'c': 3a 1Возвращает список состоящий из всех значений словаряvalueskeys)Получение первого ключа словаряfirstKey)alastKey(Получение последнего ключа словаряlastKey'c'first 2, 'c': 3}.last()contains(item словарь содержит элемент item 1, : 2, 'c3}.contains(21, bb2fadd01f7d0ac9864dc963a61f653f2, 'c': 3].contains(4)
МетодОписаниеПримерРезультат
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()

, 'b': 2, '

c':

3}

values()

.key(4)

c
nil

has(key)
Возвращает true, если элемент с указанным ключом сущеcтвует, и false в противном случае
{'a': 1, 'b': 2, 'c': 3}.
has('a')
[1, 2, 3]
keys()
Возвращает список состоящий из всех ключей словаря
{'a': 1, 'b': 2, 'c': 3}.
has(
'd')

true
false

get(key)
Возвращает элемент словаря по его ключу или nil, если такого элемента нет
['a', 'b', 'c']
firstKey()
{'a': 1, 'b': 2, 'c': 3}.
get(
'
b'
)

{'a': 1, 'b': 2, 'c': 3}.
get('d')

2

nil

set(key, item)
Получение первого элемента словаря
{'a': 1, 'b': 2, 'c': 3}.first()
1
Устанавливает элемент словаря с заданным ключом
$x = {1: true, 2: nil}
$x.set(2, false)

$x будет содержать {1: true, 2: false}

remove(key)Удаляет элемент словаря по ключу и возвращает его значение

$x =

last()
Получение последнего элемента словаря

{'a':

1,

'b':

2}
$y = $x.remove('a')

$y будет содержать 1, а $x станет равным {'b': 2}

equals(other
3
)
Возвращает true, если
other представляет собой точно такой же словарь (т.е. словарь, содержащий те же самые ключи и значения), и false в противном случае
{'a': 
'b'
}.equals(['a': 
'b'])
{'a':
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()
'b'}.equals(['b': 

true
false

'a'])
true
false
hash()
Возвращает строку, представляющую собой хэш словаря (значение, уникально идентифицирующее содержимое словаря)
{'a': true}.hash()
bb2fadd01f7d0ac9864dc963a61f653f
copy()Создаёт поверхностную копию словаря (т.е. не копирует коллекции внутри словаря).$list = ["a", "b"]
$copy = {"a": 1, "b": $list}.copy()
$copy.get("b").append("c")
$list будет равен
["a", "b", "c"]
$copy будет равен
{"a": 1, "b": ["a", "b", "c"]}
deepCopy()Создаёт полную копию словаря.$list = ["a", "b"]
$copy = {"a": 1, "b": $list}.deepCopy()
$copy.get("b").append("c")
$list будет равен
["a", "b"]
$copy будет равен
{"a": 1, "b": ["a", "b", "c"]}
merge(collection)Сливает текущий словарь с коллекций (другим кортежем, списком или словарём) и возвращает его.

{"a": true, "b": 123}.merge((1, 2))
{"a": true, "b": 123}.merge([1, 2])
{"a": true, "b": 123}.merge({"a": 321, "c": false}

{"a": true, "b": 123, 0: 1, 1: 2}
{"a": true, "b": 123, 0: 1, 1: 2}
{"a": 321, "b": 123, "c": false}

Специальное значение nil

Когда какая-либо переменная не определена, но уже используется в выражении, её значением становится nil. Это специльное специальное значение, означающее отсутствие какого-либо значения. Это значение также можно присвоить явно:.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstruetext
$x = 1 + 2 // $x содержит 3
$x = nil   // $x содержит nil

Операции

В языке выражений бота определенно несколько классов бинарных и унарных операций. Класс операции определяется её первым аргументомНекоторые операции могут быть применены к разным типам данных. Тип результата операции определяется видом операции. Например, если первый аргумент операции "+" строка, то будет произведена конкатенация строк. Если же это число, то будет осуществляться сложение чиселоперация "::" принимает в качестве аргументов строки. Поэтому все операнды этой операции будут неявно преобразованы к строке.

Приоритеты операций

Чем приоритет выше, тем раньше выполнится операция. Стандартным способом увеличения приоритета являются круглые скобки.

правая---леваялеваялеваялеваялевая, конкатенация, объединениелевая------леваялеваялеваялеваялеваяправаяправаяправаяправаяправаяправаяправаяправаяправаяправаяправая
ОперацияПриоритетАссоциативностьОписание
**12
ПраваяВозведение в степень
+11
Унарный плюс
-11-Унарный минус
~11
Побитовая инверсия
!10
Логическое отрицание
*9
ЛеваяУмножение
/9
ЛеваяДеление
\9
ЛеваяЦелочисленное деление
%9
ЛеваяОстаток от деления
+8
Левая

Сложение

-8
ЛеваяВычитание
::
8ЛеваяКонкатенация строк
<7
Меньше чем
<=7
Меньше или равно
>7
Больше чем
>=7
Больше или равно
==6
Равно
!=6
Не равно
&5
ЛеваяПобитовое И
^4
ЛеваяПобитовое исключающее ИЛИ
|3
ЛеваяПобитовое ИЛИ
&&2
ЛеваяЛогическое И
||1
ЛеваяЛогическое ИЛИ
=0
ПраваяПрисваивание
+=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 в $b обоих
ПримерРезультат
~$a

Устанавливаются те биты, которые не установлены

в $a, и наоборот

$a & $b
Устанавливает только те биты, которые установлены и в $a, и в $b
$a | $b
Устанавливает те биты, которые установлены в $a или в $b
$a ^ $b

Устанавливаются только те биты, которые установлены либо только

в $a, либо только

в $b, но не в

оба одновременно

Таблица преобразования других типов данных в число:.

ТипЗначениеРезультат
NILnil0
Логическийtrue1
Логическийfalse0
Строка""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 в противном случае

Таблица преобразования других типов данных в булевое булево значение:.

любое любая любой
ТипЗначениеРезультат
NILnilfalse
Число0false
Число
Любое ненулевоеtrue
Строка""false
Строка
Любая непустаяtrue
Объект
Любойtrue

Операции со строками

Есть только одна операция для работы со строками. Это сложение или конкатенация строк:.

Приер+
ПримерРезультат
"a" 
:: "b"
"ab"

Если первый аргумент оператора "+" не является строкой, то будет выполняться арифметическая операция сложения. Если второй аргумент операции конкатенации не является строкой, то он будет преобразован в строку согласно следующей таблицы преобразования:.

любойсериализация
ТипЗначениеРезультат
NILnil""
Число123.45"123.45"
Логическийtrue"true"
Логическийfalse"false"
Объект
Любой
Сериализация в строку

Операции сравнения

Операции сравнения выполняются над любыми типами данных и результатом их вычисления являются булевые булевы значения.

 если $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
$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 ::= "b"$a = $a :: "b"
$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, работать с очередью сообщений клиента и т.д.

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

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstruetext
$number = math.rand(5, 10) // Получаем случайное число от 5 до 10. math - название модуля, rand - название функции

Также как и в случае методов объектов имена функций могут динамически вычисляться в процессе выполнения сценария бота.

Блок кода
languagephp
themeDJango
firstline1
titleПример использования
linenumberstruetext
$funcIdx = math.rand(0, 1)                          // ПолучемПолучаем случайное число 0 или 1, которое будет индексом названия функции в кортеже.
$number = math.(('min', 'max').get($funcIdx))(3, 7) // Получаем название функции min или max и далее вызываем её. Таким образом, мы вычисляем случайным образом либо минимальное, либо максимальное значение .