Программный код
Выполнение кода в плеере QSP происходит последовательно, команда за командой, сверху вниз и слева направо:
*pl "Первая команда"
*pl "Вторая команда"
*pl "Третья команда"
*pl "Четвёртая команда" & *pl "Пятая команда" & *pl "Шестая команда"
Структура команд
Все команды в QSP составляются по общим принципам:
{оператор} [значение 1], [значение 2], ..., [значение 20]
Здесь вместо {оператор} может и должен стоять любой оператор QSP из тех, что перечислены в разделе "Ключевые слова. Операторы". Если в команде нет {оператор}, значит на самом деле на этом месте подразумевается неявный оператор.
! здесь используются явные операторы:
*pl "Ехал Грека Через Реку"
addobj "Рак"
! а здесь имеет место неявный оператор:
137 + 294
func('pow', 3, 3)
В качестве значений [значение 1], [значение 2], ... ,[значение 20] могут выступать строковые или числовые константы, переменные, значения функций, или целые выражения, а число таких значений зависит от назначения оператора. Например, для оператора *PL может быть указано лишь одно значение, а для оператора ADDOBJ от одного до трёх таких значений. Сами значения перечисляются через запятую.
*pl "Три в кубе это "+func('pow',3,3)+". Да, серьёзно. А ты не верил?"
addobj "Апельсинка", "img/orange.png", 1
Если необходимо, то для удобства чтения кода значения для операторов можно (но не обязательно) помещать в круглые скобки:
pl("Строка текста")
addobj("Отвёртка","img/screwdriver.png",3)
Внимание! В одной команде не может б ыть более одного оператора! Равно так же не может быть команды совсем без оператора. Если в вашей команде нет оператора, то вы имеете дело с неявным оператором.
Операция присваивания предполагает, что перед именем переменной стоит оператор SET, хотя обычно этот оператор опускают, то есть его тоже можно назвать "неявным":
[имя_переменной] = [значение]
Здесь = — это операция присваивания. Не путайте с операцией сравнения равно.
Порядок записи команд
Вот несколько правил и рекомендаций для корректного написания кода:
-
Каждую отдельную команду нужно записывать в отдельной строке.
-
Отступы (пробелы и символы табуляции) перед командой и после неё игнорируются плеером, поэтому вы можете ставить их в нужном количестве для удобства чтения кода:
*p "<table width=240>"
*p "<tr>"
*p "<td>Имя:</td>"
*p "<td>"
*p $name
*p "</td>"
*p "</tr>"
*p "<tr>"
*p "<td>возраст:</td>"
*p "<td>"
*p age
*p "</td>"
*p "</tr>"
*p "</table>" -
Пустые строки так же игнорируются плеером, поэтому для лучшей читаемости кода вы можете размещать их между командами:
яблоко = 1
груша = 1
*pl 'Яблок' + яблоко
*pl 'Груш' + груша -
При необходимости можно написать несколько команд в одну строку. При этом в качестве разделителя команд служит символ "&" (не путайте с операцией объединения строк):
яблоко+=1 & *pl "У меня есть <<яблоко>> яблок." & яблоко_взял=1Без необходимости так делать не рекомендуется, поскольку это ухудшает читаемость кода, а так же повышает вероятность допустить баг. Подобное перечисление команд уместно в гиперссылках:
*pl '<a href="EXEC: яблоко += 1 & GT $CURLOC">яблоко</a>'В данном случае при нажатии на ссылку выполнится код:
яблоко += 1
GT $CURLOC -
Внутреннюю часть многострочных операторов рекомендуется сдвигать вправо 2-4 пробелами (или одним символом табуляции). Это никак не влияет на выполнение, но делает код более читаемым:
IF яблоки=0 :
ADDOBJ 'Яблоко'
яблоки = 1
END -
Крайне редко для повышения читаемости кода приходится разбивать строку на несколько. Такая строка хотя и будет в коде разбита на части, но будет восприниматься плеером, как единая (сообщения об ошибках будут выводится с учётом того, что это одна строка). Чтобы следующая строка считалась частью текущей, нужно в конце текущей строки дописать
_(пробел и символ подчёркивания):if a<5 and n-b>4+5+h/7*2 or t=4: p 'TTTTTTTTT' & cla & $f='Text Variable' & goto 'FFFF'равнозначно
if a<5 and _
n-b>4+5+h/7*2 or _
t=4: p 'TTTTTTTTT' _
& cla & $f='Text Variable' _
& goto 'FFFF'Вместо разбиения строки рекомендуется видоизменить код так, чтобы разбивать строку не требовалось. Обратите внимание. Сочетание символов
_(пробел и символ подчёркивания) при склеивании строк заменяется на пробел, поэтому такой код:t _
or _
tбудет эквивалентен такому коду:
t or tРазбивать команду на две строки внутри строковой константы нельзя:
! на экране мы увидим две строки текста, а не одну:
*pl "Это строка, которую я хочу разбить _
на две строки кода, но при выводе видеть одну строку"
Комментарии
Оператор комментария ! служит для комментирования кода и позволяет оставлять "заметки на полях", которые помогут впоследствии ориентироваться в коде. Всё, что следует за оператором комментария, плеер игнорирует.
Поскольку ! — это оператор (не путайте с операцией не равно), если вы пишете его на одной строке с другими командами, нуж но обязательно ставить разделитель & (амперсанд) между последней командой и оператором комментария:
! это комментарий в отдельной строке
яблоки = 0 & ! а это комментарий в строке с командой
Исключением из этого правила является установка комментария после двоеточия в многострочном условии, цикле или действии. В этом случае амперсанд не нужен:
act "Взять яблоко": ! многострочное действие
addobj "Яблоко"
яблоко += 1
end
Так как весь текст после оператора комментария будет проигнорирован плеером, комментарий надо ставить всегда самым последним в строке из нескольких команд:
! ком ментарий. Следующие команды не работают: & *pl "Первая команда" & *pl "вторая команда"
*pl "Эта команда работает" & ! а остальные нет & *pl "вторая команда" & *pl "третья команда"
*pl "Эта команда работает" & *pl "и эта работает" & ! а последняя нет & *pl "третья команда"
*pl "Все три" & *pl " команды" & *pl "работают" & ! а это комментарий
Комментарии бывают двух видов: однострочные и многострочные.
-
Однострочный комментарий начинается от оператора комментария и заканчивается с концом строки:
! Однострочный комментарий
! и это однострочный комментарий
яблоки = 0 & ! и это однострочный комментарий -
Многострочный комментарий так же начинается от оператора комментария и заканчивается с концом строки, однако при использовании кавычек (
" "), апострофов (' ') или фигурных скобок, он может захватывать так же и те строки, что размещены внутри кавычек, апострофов или фигурных скобок:!'Многострочный
комментарий в апострофах'
яблоки = 1
сыр = 5 & ! А здесь "комментарий начинается
в той же строке, но" заканчивается 'сильно
позже'. Во всём виноваты {кавычки и скобки
} Кстати:
яблоки = 0
!'Комментарии рекомендуется писать всё-таки
в отдельных строках, а не как бутерброд с "сыром"'
Запись констант
Под константами в QSP подразумеваются конкретные числовые или строковые значения. Конкретный кортеж (запись значений в квадратных скобках) тоже можно назвать константой. В следующем примере для операторов вывода текста указаны конкретные значения, это и есть константы:
! вывод на экран числа 137. Можно назвать это число константой.
*pl 137
! вывод на экран строки текста. Эту строку можно назвать константой
*pl "На окошке крошку-мошку ловко ловит лапой кошка"
! выводим на экран кортеж. Кортеж тоже может быть константой
*pl [13, 'unit', 37]
Для записи числовых констант (чисел) используются символы цифр без дополнительных обозначений:
x = 145 & ! 145 здесь - константа
(137+299*2)/11-19 & ! целое выражение из числовых констант
Для записи строковых констант (строк) используются символы, отмечающие начало и конец такой строковой константы. Можно использовать кавычки (" "), апострофы (' '), или фигурные скобки ({ }):
*pl "Это строковая константа"
*pl 'И это строковая константа'
*pl {И даже это}
Более подробно о правилах записи строк в QSP можно почитать в разделе "Строки".
Для записи кортежей используются квадратные скобки:
*pl ['это кортеж', 'если он ', "не присвоен переменной", "его можно считать константой"]