[[help:variables|Назад: Переменные]]
====== Выражения ======
**Выражение** - это набор значений, констант, переменных, функций, связанных между собой различными операциями. Программа выполняет (интерпретирует) такое выражение, вычисляя его значение.
Для изменения приоритета операций в выражении могут присутствовать круглые скобки.
===== Обозначения =====
* ''%%[выр]%%'' - выражение может быть как текстового, так и числового типа.
* ''%%[$выр]%%'' - выражение текстового (строкового) типа (но при необходимости движок автоматически переведёт число в строку).
* ''%%[#выр]%%'' - выражение числового типа (если возможно, движок автоматически переведёт строку в число).
* ''%%[%выр]%%'' - выражение возвращает кортеж.
**Примечание.** Символ ''%%#%%'' использован в справке только чтобы разделить выражения произвольного и числового типов. К синтаксису QSP данный символ отношения не имеет.
===== Приоритет операций =====
Операции в выражении выполняются в порядке приоритета. Операции с одинаковым приоритетом выполняются по порядку слева направо.
Вот список операций для плееров **QSP** версии 5.9.0 в порядке повышения приоритета (от меньшего к большему):
* **''OR''**
* **''AND''**
* **''NO''**
* **''=''**, **''<''**, **''>''**, **''!''**, **''<>''**, **''%%<=%%''**, **''>=''**, **''=<''**, **''%%=>%%''** (операции сравнения)
* **''OBJ''**, **''LOC''**
* **''&''** (конкатенация)
* **''+''**, **''-''** (сложение, вычитание)
* **''MOD''**
* **''*''**, **''/''** (умножение, деление)
* **''-''** (унарный минус)
* **''([выр])''** - выражения в скобках
Выражения в **QSP** должны удовлетворять следующим условиям:
* Максимальная вложенность выражений - 30. Т.е. не глубже 30-ти открытых и вложенных друг в друга скобок.
* Максимальное количество операций на одном уровне вложенности - 100.
===== Описание операций =====
**Важно!** Поскольку в **QSP** нет булевого типа данных, истинность или ложность выражения определяется по его числовому значению. Верным считается числовое выражение, значение которого отлично от ''%%0%%''. При значении ''%%0%%'' выражение считается ложным. Для значения "верно" настоятельно рекомендуется использовать число ''%%1%%'', т.к. операции сравнения и логические операции возвращают именно это значение в случае истинности выражения.
==== Математические операции ====
* **''-[#выр]''** - унарный минус. Можно поставить перед числовым выражением и таким образом поменять знак этого выражения на противоположный:
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 равен 0
10 mod 3 & ! 10/3 = 3 -> 3*3=9 -> 10-9 = 1 -> остаток от деления 10 на 3 равен 1
10 mod 4 & ! 10/4 = 2 -> 4*2=8 -> 10-8 = 2 -> остаток от деления 10 на 4 равен 2
10 mod 5 & ! 10/5 = 2 -> 5*2=10 -> 10-10 = 0 -> остаток от деления 10 на 5 равен 0
10 mod 6 & ! 10/6 = 1 -> 6*1=6 -> 10-6 = 4 -> остаток от деления 10 на 6 равен 4
10 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 не меньше 45
if 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 не больше 45
if 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 равно 45
if 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 равно 45
if x >= y:
"X больше либо равно Y"
else
"Y больше X"
end
**Примечание.** Запись ''**%%=>%%**'' редко применяется в других языках программирования, поэтому рекомендуем не привыкать к её использованию, хотя в **QSP** это ошибкой не будет.
==== Логические операции ====
* ''**OBJ** [$выр]'' - операция проверки наличия предмета в **Инвентаре**. Верно, если в **Окне предметов** есть предмет с названием ''%%[$выр]%%''.
addobj "Отвёртка"
*pl obj "Отвёртка" & ! на экране будет число 1, так как предмет **Отвёртка** есть в окне предметов
*pl obj "Апельсин" &! на экране будет число 0, так как предмета **Апельсин** нет в окне предметов
if obj "Отвёртка":
*pl "У вас есть отвёртка."
else
*pl "У вас нет отвёртки."
end
* ''**LOC** [$выр]'' - операция проверки наличия локации в игре. Верно, если в игре есть локация с названием ''%%[$выр]%%''.
! в игре создана локация "Густая чаща"
*pl loc "Густая чаща" & ! на экране мы увидим число 1
if 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]'' не вычисляется.
==== Операции со строками ====
Операции сравнения строк, а так же функции для работы со строками описаны в разделе [[help:strings|Строки]].
* ''%%([$выр1] & [$выр2])%%'' - операция объединения строковых выражений (конкатенация). Не путайте с символом перечисления команд. Примеры:
! в данном случае на экран будут последовательно выведены строки "26" и "27"
"26" & "27"
! в данном случае на экран будет выведена строка "2627"
("26" & "27")
Во избежание путаницы, для объединения строк используйте операцию ''%%+%%'', она работает точно так же. При попытке конкатенации двух числовых значений они преобразуются в строку.
* ''%%[$выр1] + [$выр2]%%'' - операция объединения строковых выражений. Примеры:
! в данном случае на экран будет выведена строка "2627"
"26" + "27"
==== Операции с кортежами ====
Другие операции и функции для работы с кортежами представлены в разделе [[help:tuples|Кортежи]].
* ''([%выр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' & ! ошибка о несоответствии типов данных
==== Операции с присваиванием ====
Помимо обыкновенной [[help:variables|операции присваивания]] в **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
[[help:coding|Вперёд: Программный код]]