Выражения
Выражение - это набор значений, констант, переменных, функций, связанных между собой различными операциями. Программа выполняет (интерпретирует) такое выражение, вычисляя его значение.
Для изменения приоритета операций в выражении могут присутствовать круглые скобки.
Обозначения
[выр]- выражение может быть как текстового, так и числового типа.[$выр]- выражение текстового (строкового) типа (но при необходимости движок автоматически переведёт число в строку).[#выр]- выражение числового типа (если возможно, движок автоматически переведёт строку в число).[%выр]- выражение возвращает кортеж.
Примечание. Символ # использован в справке только чтобы разделить выражения произвольного и числового типов. К синтаксису QSP данный символ отношения не имеет.
Приоритет операций
Операции в выражении выполняются в порядке приоритета. Операции с одинаковым приоритетом выполняются по порядку слева направо.
Вот список операций для плееров QSP версии 5.9.0 в порядке повышения приоритета (от меньшего к большему):
ORANDNO=,<,>,!,<>,<=,>=,=<,=>(операции сравнения)OBJ,LOC&(конкатенация)+,-(сложение, вычитание)MOD*,/(умножение, деление)-(унарный минус)([выр])- выражения в скобках
Выражения в QSP должны удовлетворять следующим условиям:
- Максимальная вложенность выражений - 30. Т.е. не глубже 30-ти открытых и вложенных друг в друга скобок.
- Максимальное количество операций на одном уровне вложенности - 100.
Описание операций
Правда или Ложь?
Поскольку в QSP нет булевого типа данных, истинность или ложность выражения определяется по его числовому значению. Верным считается числовое выражение, значение которого отлично от 0. При значении 0 выражение считается ложным. Для значения "верно" настоятельно рекомендуется использовать число 1, т.к. операции сравнения и логические операции возвращают именно это значение в случае истинности выражения.
Начиная с версии 5.9.4 верными так же считаются:
- строковые значения, отличные от пустой строки (
"").-
Примеры:
if '': *pl 'Пустая строка. Надпись не ув идим.'if 'непустая строка': *pl 'Условие выполняется. Надпись увидим.'
-
- непустые кортежи, в т.ч. содержащие пустые кортежи.
-
Примеры:
if []: *pl 'Пустой кортеж. Надпись не увидим.'if [[]]: *pl 'Не пустой кортеж. Надпись увидим.'
-
Благодаря этому вы можете использовать логические операции со значениями любого типа и не проводить явного сравнения со значениями по умолчанию.
Пример со строками:
-
В QSP 5.9.3 и ниже:
loop while $name = '':$name = $input('Введите имя:')end -
В QSP 5.9.4 и выше:
loop while no $name:$name = $input('Введите имя:')end
Математические операции
-
-[#выр]- унарный минус. Можно поставить перед числовым выражением и таким образом поменять знак этого выражения на противоположный:x = -12*pl -x & ! выведет на экран число 12*pl -(123*12/-10)*pl -10/-5 -
+,-,*,/- сложение, вычитание, умножение, деление соответственно.\
Операции записываются как [#выр1] [операция] [#выр2]:
15+2*5 &! 15+2*5 = 15+10 = 25
15*2+5 &! 15*2+5 = 30+5 = 25
15*5/2 &! (15*5)/2 = 75/2 = 37
15/2*5 &! (15/2)*5 = 7*5 = 35
-
[#выр1] MOD [#выр2]- остаток от деления. Это операция, которой нас учат ещё в начальной школе. Если мы вычисляем, сколько раз число делится нацело на другое число, то в результате может остаться некая неучтённая часть. Например, если мы хотим разделить 10 на 3, то число 10 нацело делится на 3 только три раза. Но 3 умножить на 3 - это 9. Значит, от десяти осталась часть, которая не делится на 3, это 1 (10 - 9 = 1). Эта часть и называется остатком от деления. Для числа 12 остаток от деления на 3 составляет ноль, поскольку двенадцать делится на 3 ровно четыре раза. Примеры:10 mod 2 & ! 10/2 = 5 -> 2*5=10 -> 10-10 = 0 -> остаток от деления 10 на 2 равен 010 mod 3 & ! 10/3 = 3 -> 3*3=9 -> 10-9 = 1 -> остаток от деления 10 на 3 равен 110 mod 4 & ! 10/4 = 2 -> 4*2=8 -> 10-8 = 2 -> остаток от деления 10 на 4 равен 210 mod 5 & ! 10/5 = 2 -> 5*2=10 -> 10-10 = 0 -> остаток от деления 10 на 5 равен 010 mod 6 & ! 10/6 = 1 -> 6*1=6 -> 10-6 = 4 -> остаток от деления 10 на 6 равен 410 mod 7 & ! 10/7 = 1 -> 7*1=7 -> 10-7 = 3 -> остаток от деления 10 на 7 равен 3
Операции сравнения
Сравнивать можно данные любых типов. Подробнее о сравнении стр ок и кортежей читайте в соответствующих разделах.
-
[выр1] = [выр2]- операция равно. Верно, если значения рядом стоящих выражений равны. Данную операцию не стоит путать с операцией присваивания, хотя на первый взгляд они похожи. Чтобы операция равно корректно вернула значение, она должна быть записана после ключевого словаIF,ELSEIF,WHILEили в первом аргументе функцииIIF, или стоять после явного оператора вывода текста вроде*PL, или если используется с неявным оператором, быть заключённой в скобки. Примеры:! операция сравнения **равно** с явным указанием оператора перед ней:*pl 6+12 = 6*3 & ! 6+12 = 6*3 -> 18=18 -> на экране мы увидим число 1, что означает, что значения выражений равны*pl 226 = 15*15 & ! 226 = 15*15 -> 226=225 -> на экране увидим **0**, так как 226 не равно 225.! операция сравнения **равно** с неявным оператором('ab'+'cd' = 'abc'+'d') & ! на экране увидим 1, так как 'ab'+'cd' равно 'abc'+'d'(13*9 = 19*3) & ! на экране увидим 0, так как 13*9 не равно 19*3! операция сравнения в условииif x = y:*pl "Числа равны"else*pl "Числа не равны"end -
[выр1] < [выр2]- операция меньше. Верно, если значение выражения слева меньше значения выражения справа.*pl 37<56 & ! на экране будет число 1, так как 37 меньше 56*pl 45<23 & ! на экране будет число 0, так как 45 не меньше 23*pl 45<45 & ! на экране будет число 0, так как 45 не меньше 45if x < y:"X меньше Y"elseif y < x:"Y меньше X"else"Числа равны"end -
[выр1] > [выр2]- операция больше. Верно, если значение выражения слева больше значения выражения справа.*pl 37>56 & ! на экране будет число 0, так как 37 не больше 56*pl 45>23 & ! на экране будет число 1, так как 45 больше 23*pl 45>45 & ! на экране будет число 0, так как 45 не больше 45if x > y:"X больше Y"elseif y > x:"Y больше X"else"Числа равны"end -
[выр1] ! [выр2], [выр1] <> [выр2]- операция не равно. Верно, если значения рядом стоящих выражений не равны.! операция сравнения **равно** с явным указанием оператора перед ней:*pl 6+12 ! 6*3 & ! 6+12 = 6*3 -> 18=18 -> на экране мы увидим число 0, что означает, что значения выражений не равны*pl 226 ! 15*15 & ! 226 = 15*15 -> 226=225 -> на экране увидим **1**, так как **226** не равно **225**.! операция сравнения **равно** с неявным оператором*pl 'ab'+'cd' <> 'abc'+'d' & ! на экране увидим 0, так как 'ab'+'cd' равно 'abc'+'d'*pl 13*9 <> 19*3 & ! на экране увидим 1, так как 13*9 равно 19*3! операция сравнения в условииif x <> y:*pl "Числа не равны"else*pl "Числа равны"endПримечание. Во избежание путаницы с оператором комментария
!лучше не использовать для записи операции не равно восклицательный знак. -
[выр1] <= [выр2], [выр1] =< [выр2]- операция меньше либо равно. Верно, если значение выражения слева меньше или равно значению выражения справа.*pl 37<=56 & ! на экране будет число 1, так как 37 меньше 56*pl 45<=23 & ! на экране будет число 0, так как 45 не меньше и не равно 23*pl 45<=45 & ! на экране будет число 1, так как 45 равно 45if x <= y:"X меньше либо равно Y"else"Y меньше X"endПримечание. Запись
=<редко применяется в других языках программирования, поэтому рекомендуем не привыкать к её использованию, хотя в QSP это ошибкой не будет. -
[выр1] >= [выр2], [выр1] => [выр2]- операция больше либо равно. Верно, если значение выражения слева больш е или равно значению выражения справа.*pl 37>=56 & ! на экране будет число 0, так как 37 не больше и не равно 56*pl 45>=23 & ! на экране будет число 1, так как 45 больше 23*pl 45>=45 & ! на экране будет число 1, так как 45 равно 45if x >= y:"X больше либо равно Y"else"Y больше X"endПримечание. Запись
=>редко применяется в других языках программирования, поэтому рекомендуем не привыкать к её использованию, хотя в QSP это ошибкой не будет.
Логические операции
-
OBJ [$название]- возвращает число предметов с названием[$выр]. Подробнее в разделе Предметы (инвентарь) -
LOC [$выр]- операция проверки наличия локации в игре. Верно, если в игре есть локация с названием[$выр].! в игре создана локация "Густая чаща"*pl loc "Густая чаща" & ! на экране мы увидим число 1if loc "Дом":*pl "Вы можете войти в дом."else*pl "Вы не можете войти в дом."end -
NO [$выр]- операция отрицания, логическое отрицание, или логическая инверсия. Если[#выр]верно, операция возвращает 0, а если[#выр]не верно, операция возвращает 1. Примеры:*pl no 1 & ! на экране увидим 0, так как 1 соответвует верному выражению*pl no 7 & ! на экране увидим 0, так как 7 соответвует верному выражению*pl no 0 & ! на экране увидим 1, так как 0 соответствует неверному выражениюaddobj "Отвёртка"if no obj "Отвёртка":"У вас нет отвёртки."else"У вас есть отвёртка."end -
[#выр1] OR [#выр2]- операция логического "или". Всё выражение верно, если хотя бы одна из его частей верна:[#выр1]или[#выр2]. Примеры:*pl 1 or 1 & ! на экране увидим 1, так как обе части выражения равны 1*pl 1 or 0 & ! на экране увидим 1, так как левая часть равна 1*pl 0 or 1 & ! на экране увидим 1, так как правая часть равна 1*pl 0 or 0 & ! на экране увидим 0, так как обе части выражения равны 0! обе части выражения верны, значит и всё выражение верно:(2=2) or (3<>2) & ! выражение вернёт 1 (правда)! одна часть выражения верна, значит всё выражение верно:(2<>2) or (3<>2) & ! выражение вернёт 1 (правда)! обе части выражения не верны, значит и всё выражение не верно:(2<>2) or (3=2) & ! выражение вернёт 0 (ложь)Если
[#выр1]верно, значение[#выр2]не вычисляется. -
[#выр1] AND [#выр2]- операция логического "и". Всё выражение верно, только если обе его части верны: и[#выр1], и[#выр2]. Примеры:*pl 1 and 1 & ! на экране увидим 1, так как обе части выражения равны 1*pl 1 and 0 & ! на экране увидим 0, так как только левая часть равна 1*pl 0 and 1 & ! на экране увидим 0, так как только правая часть равна 1*pl 0 and 0 & ! на экране увидим 0, так как обе части выражения равны 0! обе части выражения верны, значит и всё выражение верно:(2=2) and (3<>2) & ! выражение вернёт 1 (правда)! одна часть выражения не верна, значит всё выражение неверно:(2<>2) and (3<>2) & ! выражение вернёт 0 (ложь)! обе части выражения не верны, значит и всё выражение не верно:(2<>2) and (3=2) & ! выражение вернёт 0 (ложь)Если
[#выр1]не верно, значение[#выр2]не вычисляется.
Операции со строками
Операции сравнения строк, а так же функции для работы со строками описаны в разделе Строки.
-
([$выр1] & [$выр2])- операция объединения строковых выражений (конкатенация). Не путайте с символом перечисления команд. Примеры:! в данном случае на экран будут последовательно выведены строки "26" и "27""26" & "27"! в данном случае на экран будет выведена строка "2627"("26" & "27")Во избежание путаницы, для объединения строк используйте операцию
+, она работает точно так же. При попытке конкатенации двух числовых значений они преобразуются в строку. -
[$выр1] + [$выр2]- операция объединения строковых выражений. Примеры:! в данном случае на экран будет выведена строка "2627""26" + "27"
Операции с кортежами
Другие операции и функции для работы с кортежами представлены в разделе Кортежи.
-
([%выр1] & [%выр2])- операция объединения кортежей (конкатенация). Не путайте с символом перечисления команд. Примеры:! в данном случае на экран будут последовательно выведены кортежи [26, 27] и [37, 48][26, 27] & [37, 48]! в данном случае на экран будет выведен кортеж [26, 27, 37, 48]([26, 27] & [37, 48]) -
[%выр1] + [выр2]- операция увеличения значений кортежа. К каждому элементу кортежа%выр1будет прибавлен элементвыр2.выр2может быть кортежем, тогда каждый элемент%выр1будет сложен с кортежем%выр2. Примеры:%tuple = [4, 10, 16]%a = %tuple + 2! %a будет равно [6, 12, 18][4, 10] + ['b', 'x'] & ! [4 + ['b', 'x'], 10 + ['b', 'x']] ! [['4b','4x'], ['10b','10x']] -
[%выр1] - [#выр2]- операция уменьшения значений кортежа. Из каждого элемента кортежа%выр1будет вычтен элемент#выр2.#выр2может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры:%tuple = [4, 10, 16]%a = %tuple - 2! %a будет равно [2, 8, 14][4, 10] - ['b', 'x'] & ! ошибка о несоответствии типов данных -
[%выр1] * [#выр2]- операция увеличения значений кортежа. Каждый элемент кортежа%выр1будет умножен на значение элемента#выр2.#выр2может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры:%tuple = [4, 10, 16]%a = %tuple * 2! %a будет равно [8, 20, 32][4, 10] * 'b' & ! ошибка о несоответствии типов данных -
[%выр1] / [#выр2]- операция сокращения значений кортежа. Каждый элемент кортежа%выр1будет поделён на значение элемента#выр2.#выр2может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры:%tuple = [4, 10, 16]%a = %tuple / 2! %a будет равно [2, 5, 8][4, 10] / 'b' & ! ошибка о несоответствии типов данных
Операции с присваиванием
Помимо обыкновенной операции присваивания в QSP существуют так же совмещённые математические операции с присваиванием.
-
+=— операция "сложение с присваиванием", сочетающая в себе операции присваивания и сложения. Прибавляет к текущему значению переменной указанное значение. Общая запись:имя_переменной += [выражение]Эквивалентно конструкции:
имя_переменной = имя имя_переменной + [выражение]Пример:
! мы заменяем две операции: присвоения и сложенияwarrior = warrior+15! на одну (действие аналогично)warrior += 15Примечание: данную операцию можно использовать и для склейки строк. При этом строка "приклеивается в конец уже существующей строки":
$text = 'Вечное слово в остывшей'$text += ' золе...' -
-=— операция "вычитание с присваиванием", сочетающая в себе операции присваивания и вычитания. Вычитает из текущего значения переменной указанное значение. Общая запись:имя_переменной -= [#выражение]Эквивалентно конструкции:
имя_переменной = имя имя_переменной - [#выражение]Пример:
! мы заменяем две операции: присвоения и вычитанияwarrior = warrior - 15! на одну (действие аналогично)warrior -= 15 -
/=— операция "деление с присваиванием", сочетающая в себе операции присваивания и деления. Делит текущее значение переменной на указанное значение. Общая запись:имя_переменной /= [#выражение]Эквивалентно конструкции:
имя_переменной = имя имя_переменной / [#выражение]Пример:
! мы заменяем две операции: присвоения и деленияwarrior = warrior / 2! на одну (действие аналогично)warrior /= 2 -
*=— операция "умножение с присваиванием", сочетающая в себе операции присваивания и умножения. Умножает текущее значение переменной на указанное значение. Общая запись:имя_переменной *= [#выражение]Эквивалентно конструкции:
имя_переменной = имя имя_переменной * [#выражение]Пример:
! мы заменяем две операции: присвоения и умноженияwarrior = warrior * 2! на одну (действие аналогично)warrior *= 2
Операции с присваиванием применимы и к кортежам. В этом случае кортежи изменяются по такому же принципу, как в операциях +, -, /, *.
Другие примеры
x = 5
y = 6
(x ! y) OR (x <> y) &! Результат 1
x OR y
&! Результат 1
x AND y
&! Результат 1
y MOD x
&! 6/5 -> остаток 1 Результат 1
OBJ 'стул' &! Если в инвентаре есть предмет 'стул', то результат 1, если нет, то 0
LOC 'дом' &! Если в игре есть локация 'дом', то результат 1, если нет, то 0
res = x*y + y*-x/2 &! (5*6) + (6*(-5)/2)=15 -> в res запишется число 15
res = NO x = y &! NO 5 = 6 -> NO 0 -> в res запишется число 1