Difference between revisions of "Qubot Script/ru"
| Line 347: | Line 347: | ||
URL = "https://qudata.com/qubot/im/" | URL = "https://qudata.com/qubot/im/" | ||
image(URL + "owl_a.png") | image(URL + "owl_a.png") | ||
| − | text({ en: | + | text({ en: URL + "en.png", ru: URL + "ru.png"}) |
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 14:12, 7 April 2022
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 // бинарный
sRegExp = /[abc]/ // регулярное выражение
Логические операции
- 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 // пример однострочного комментария
Работа со словарем (объектом)
Объявление словаря:
dic = { n: 1, s: "Wine" }
Доступ к значениям словаря:
a = dic.n // доступ к полю с именем "n" через точку
a = dic["n"] // доступ к полю с именем "n" через оператор доступа
dic["food"] = "milk" // добавление в словарь пары ключ-значение
Работа с массивами
Объявление массива:
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) // выведет объекты, удовлетворяющие условию
Работа со строками
Объявление строковых слотов:
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 = "price: 4.99\$ \{sale\}" // вычислит выражение и вставит результат в строку
print(str) // выведет: "price: 4.99$ {sale}"
Функции работы со строками:
str = "hello"
len = str.length // получить длинну строки
sub = str.substring(3,5) // получить подстроку начиная с 3-й позиции и до 5-й не включая
pos = str.search('lo') // получить позицию подстроки, иначе -1
pos = str.search(/lo/) // получить позицию подстроки используя регулярное выражение, иначе -1
Условный оператор
Оператор 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) выводящий значение в отладочное окно
Оператор выбора switch
Конструкция switch заменяет собой сразу несколько if. Она представляет собой более наглядный способ сравнить выражение сразу с несколькими вариантами. Имеет один или более блок case и необязательный блок default.
a = 'one'
switch(a)
{
case 'one': print('one'); break;
case 'two': print('two'); break;
default: print('def')
}
Переменная проверяется на строгое соответствие значению справа от case и если оно совпадает, то выполняется код до тех пор пока не встретится оператор break
Если ни одно из case не подошло, выполняется код справа от default
Оператор in
Оператор in проверяет есть ли значение в массиве либо является ключём в словаре.
sArr = [7, 7.3, "hello"] // массив
print("hello" in sArr) // вернет true, т.к. значение "hello" присутствует в массиве sArr
sDic = { price: 100, food: "Wine"} // словарь
print("food" in sDic) // вернет true, т.к. ключ "food" присутствует в словаре sDic
Переменная проверяется на строгое соответствие значению справа от case и если оно совпадает, то выполняется код до тех пор пока не встретится оператор break
Если ни одно из case не подошло, выполняется код справа от default
Оператор button
Данный оператор добавляет в интерфейс кнопку с необходимым текстом и логику, которая должна быть выполнена при нажатии
button('click me') // текст в кнопке
{
// скрипт, который выполнится после нажатия
print('button was clicked!')
step('STATE_AFTER_CLICK')
}
При нажатии на кнопку скрипт будет выполнен в контексте локальных переменных на момент добавления данной кнопки, а также в контексте значений слотов на момент нажатия на кнопку!
Функции перехода
run(state) - выполнить логику шага state
step(state) - установка шага перехода по умолчанию в значение state
goto(state) - мгновенный переход в шаг state
Функции работы с контентом
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 - это строка, то он используется не зависимо от текущего языка. Если url - объект, то он должен состоять из двухбуквенных ключей (идентификаторов языка: en, ru,…) со строковыми значения на этих языках.. Необязательный параметр width указывает насколько в процентах нужно сжать изображение
URL = "https://qudata.com/qubot/im/"
image(URL + "owl_a.png")
text({ en: URL + "en.png", ru: URL + "ru.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].