Qubot Script/ru
Qubot Script
Qubot Script - это язык программирования, используемый для выполнения логических и математических операций при решении задач бота
Слоты
Слот - это переменная, значение которой доступно во всех состояниях бота. Также значение слота сохраняется, если бота закрыли и продолжили с ним работать через время.
Объявление слота происходит при первом присваивании в него значений.
Например:
a = 7
объявляет слот с именем a и присваивает ему значение 7
Локальные переменные
В отличие от слотов локальные переменные сохраняются только внутри скрипта, где они объявлены.
Объявление происходит путем добавления перед именем служебного слова local:
local b = 8 // локальная переменная
Если локальная переменная объявлена внутри фигурных скобок {}, то и ее значение доступно только там:
local b = 8 // локальная переменная текущего скрипта
if (b == 8)
{
local c = 9 // локальная переменная блока оператора 'if'
print(c) // выведет 9
}
print(b) // выведет 8
print(c) // выдаст ошибку, т.к. тут уже переменная 'с' не доступна
Типы переменных
sInt = 7 // целочисленный
sFloat = 7.3 // вещественный
sStr = "hello" // строковый
sArr = [7, 7.3, "hello", sStr] // массив
sDic = { n: 1, s: "Wine" } // словарь
sBool = true // бинарный
Логические операции
- and - логическое ‘И’
- or - логическое ‘ИЛИ’
- not - отрицание ‘НЕТ’
Например:
a = true
b = false
c = true
res = not((a and b) or c)
Арифметические операции
- + - сложение
- - - вычитание
- * - умножение
- / - деление
Например:
res = 2+3-4*5+(1.5-0.2/2)
Комментарии
Комментарии используются для документирования фрагментов скрипта. Могут быть многострочыми и однострочными:
/*
Пример
многострочного
комментария
*/
a = 2253 // пример однострочного комментария
Условный оператор
Оператор if используется, если необходимо ветвление логики в зависимости от условия
a = 9
if (a > 7)
{
res = 'a more than 7'
}
else
{
res = 'a less or equal 7'
}
В данном примере проверяется условие a > 7 и если оно истинно, то выполняется первый блок скрипта, окруженный фигурными скобками, иначе выполняется блок после служебного слова else
Цикл while
Оператор цикла проверяет условие и пока оно истинно, выполняет код окруженный фигурными скобками
a = 7
while (a > 0)
{
a = a - 1
}
В данном примере скрипт a = a - 1 будет выполнятся до тех пор пока значение слота a не станет равным нулю
Итератор for
Итератор используется для перебора всех значений массива, либо ключей из словаря
arr = [3,2,1]
for(val in arr)
{
print(val)
}
output:
3
2
1
В данном примере цикл последовательно перебирает значения массива и заносит их во временную переменную val соответственно для каждого элемента массива выполняется окруженный фигурными скобками скрипт print(val) выводящий значение в отладочное окно
Работа с массивами
Объявление массива:
arr = [1,2,3] // создает массив с тремя элементами со значениями 1,2,3
Доступ к элементам массива:
first = arr[0] // получить первый элемент массива
last = arr[-1] // получить последний элемент массива
last = arr[-2] // получить предпоследний элемент массива
arr[0] = 7 // изменить значение первого элемента
Функции работы с массивом:
len = arr.length // получить длинну массива
arr.push(4) // добавить в конец массива элемент со значением '4'
arr.unshift(0) // добавить в начало массива элемент со значением '0'
arr.pop() // удалить последний элемент массива
arr.shift() // удалить первый элемент массива
arr.slice(start,end) // возращает часть массива начиная с позиции 'start' и указана позиция 'end', то до нее (не включая)
arr.splice(start,end) // удаляет часть массива начиная с позиции 'start' и указана позиция 'end', то до нее (не включая)
Поиск в массиве из словарей:
arr = [
{title: "Wine", price: 120},
{title: "Cheese", price: 100},
{title: "Cola", price: 40},
]
local res = arr.find(price > 80) // найти все словари у которых поле 'price' больше 80 и вернуть их в массиве
print('найдено $res.length:') // выведет количество найденных объектов
print(res) // выведет объекты, удовлетворяющие условию
Работа со словарем (объектом)
Объявление словаря:
dic = { n: 1, s: "Wine" }
Доступ к значениям словаря:
a = dic.n // доступ к полю с именем "n" через точку
a = dic["n"] // доступ к полю с именем "n" через оператор доступа
dic["food"] = "milk" // добавление в словарь пары ключ-значение
Работа со строками
Объявление строковых слотов:
str = "hello" // используя двойные кавычки
str = 'hello' // используя одинарные кавычки
Операции со строками:
base = 'http://imgs/'
url = base + 'img1.png' // сложение строк
Подстановка слотов в строки:
a = 5
str = "a = $a" // вместо $a будет подставлено значение слота a
print(str) // выведет: "a = 5"
Вставка выражений в строки:
Выражения можно вставлять в строки, обрамляя их двойными фигурными скобками:
str = "2 + 3 = {{2+3}}" // вычислит выражение и вставит результат в строку
print(str) // выведет: "2 + 3 = 5"
Функции работы со строками:
str = "hello"
len = str.length // получить длинну строки
sub = str.substring(3,5) // получить подстроку начиная с 3-й позиции и до 5-й не включая
pos = str.search('lo') // получить позицию подстроки, иначе -1
Функции перехода
run(state) - выполнить логику шага state
step(state) - установка шага перехода по умолчанию в значение state
goto(state) - мгновенный переход в шаг state
Оператор button
Данный оператор добавляет в интерфейс кнопку с необходимым текстом и логику, которая должна быть выполнена при нажатии
button('click me') // текст в кнопке
{
// скрипт, который выполнится после нажатия
print('button was clicked!')
step('STATE_AFTER_CLICK')
}
При нажатии на кнопку скрипт будет выполнен в контексте локальных переменных на момент добавления данной кнопки, а также в контексте значений слотов на момент нажатия на кнопку!
Функции работы с контентом
text(obj) - вывести в текущее сообщение текст. Если obj - это сторока, то она выводится не зависимо от текущего языка. Если obj - объект, то он должен состоять из двубуквенных ключей (идентификаторов языка: en, ru,…) со строковыми значения на этих языках.
text("Hi world!")
text({ en: "Hi world!", ru: "Привет мир!", es: "¡Hola mundo!"})
images() - создать новую строку картинок. Каждый последующий вызов image будет добавляться в эту строку, пока снова не будет вызван images().
URL = "https://qudata.com/qubot/im/"
images()
image(URL + "owl_a.png")
image(URL + "owl_b.png")
image(url, width) - вывести в текущее сообщение картинку, находящуюся по адресу url. Необязательный параметр width указывает насколько в процентах нужно сжать изображение
URL = "https://qudata.com/qubot/im/"
image(URL + "owl_a.png")
buttons() - создать новую строку кнопок. Каждый последующий вызов button будет добавляться в эту строку, пока снова не будет вызван buttons().
get_check() - получить массив значений кнопок типа check (1 - нажата, 0 - отжата)
set_check(list) - задать значения кнопок типа check из массива list.
CHECK = [0,1,0]
set_check(CHECK)
get_radio() - получить массив значений кнопок типа radio (1 - нажата, 0 - отжата). Единица будет одна.
set_radio(list) - задать значения кнопок типа radio из массива list.
Отладчные функции
print(args) - вывод информации в окно отладки
Округление
floor(val) - округление чисел в меньшую сторону:
floor(5.8) // 5
floor(-6.1) // -7
trunc(val) - отбрасывание дробной части:
trunc(5.51) // 5
trunc(-6.99) // -6
ceil(val) - округление чисел в большую сторону:
ceil(5.15) // 6
round(val, num) - округление val до num чисел после запятой:
round(3.14159265, 2) // 3.14
Случайные числа
randint(min,max) - возвращает целое случайное число в диапазоне [min,max].
random() - возвращает случайное вещественное число в диапазоне [0,1].