Инструменты пользователя

Инструменты сайта


Боковая панель

help:expressions

Это старая версия документа.


Назад: Переменные

Выражения

Выражение - это набор значений, констант, переменных, функций, связанных между собой различными операциями. Программа выполняет (интерпретирует) такое выражение, вычисляя его значение.

Для изменения приоритета операций в выражении могут присутствовать круглые скобки.

Обозначения

  • [выр] - выражение может быть как текстового, так и числового типа.
  • [$выр] - выражение текстового (строкового) типа (но при необходимости движок автоматически переведёт число в строку).
  • [#выр] - выражение числового типа (если возможно, движок автоматически переведёт строку в число).

Примечение. Символ # использован в справке только чтобы разделить выражения произвольного и числового типов. К синтаксису QSP данный символ отношения не имеет.

Приоритет операций

Операции в выражении выполняются в порядке приоритета. Операции с одинаковым приоритетом выполняются по порядку слева направо.

Вот список операций для плееров QSP версии 5.8.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] не вычисляется.

Операции со строками

  • [$выр1] & [$выр2] - операция объединения строковых выражений. Подробнее см. Строки. Не путайте с символом перечисления команд. Примеры:
    		! в данном случае на экран будут последовательно выведены строки "26" и "27"
    		"26" & "27"
    		! в данном случае на экран будет выведена строка "2627"
    		("26" & "27")
    
    
    Во избежание путаницы, для объединения строк используйте операцию +, она работает точно так же.
  • [$выр1] + [$выр2] - операция объединения строковых выражений. Подробнее см. Строки. Примеры:
    		! в данном случае на экран будет выведена строка "2627"
    		"26" + "27"
    

Другие примеры

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

Операции с присваиванием

[:sokraschennye_operacii_s_prisvoeniem]

Помимо обыкновенной операции присваивания в QSP существуют так же совмещённые математические операции с присваиванием.

  • += — операция "сложение с присваиванием", сочетающая в себе операции присваивания и сложения. Прибавляет к текущему значению переменной указанное значение. Общая запись:
    			имя_переменной+=[выражение]
    
    Эквивалентно конструкции:
    			имя_переменной=имя имя_переменной+[выражение]
    
    Пример:
    		! мы заменяем две операции: присвоения и сложения
    		warrior=warrior+15
    		! на одну (действие аналогично)
    		warrior+=15
    
    Примечание: данную операцию можно использовать и для склейки строк. При этом строка "приклеивается в конец уже существующей строки":
    		$text='Вечное слово в остывшей'
    		$text+=' золе...'
    
  • -= — операция "вычитание с присваиванием", сочетающая в себе операции присваивания и вычитания. Вычитает из текущего значения переменной указанное значение. Общая запись:
    			имя_переменной-=[#выражение]
    
    Эквивалентно конструкции:
    			имя_переменной=имя имя_переменной-[#выражение]
    
    Пример:
    		! мы заменяем две операции: присвоения и вычитания
    		warrior=warrior-15
    		! на одну (действие аналогично)
    		warrior-=15
    
  • /= — операция "деление с присваиванием", сочетающая в себе операции присваивания и деления. Делит текущее значение переменной на указанное значение. Общая запись:
    			имя_переменной/=[#выражение]
    
    Эквивалентно конструкции:
    			имя_переменной=имя имя_переменной/[#выражение]
    
    Пример:
    		! мы заменяем две операции: присвоения и деления
    		warrior=warrior/2
    		! на одну (действие аналогично)
    		warrior/=2
    
  • *= — операция "умножение с присваиванием", сочетающая в себе операции присваивания и умножения. Умножает текущее значение переменной на указанное значение. Общая запись:
    			имя_переменной*=[#выражение]
    
    Эквивалентно конструкции:
    			имя_переменной=имя имя_переменной*[#выражение]
    
    Пример:
    		! мы заменяем две операции: присвоения и умножения
    		warrior=warrior*2
    		! на одну (действие аналогично)
    		warrior*=2
    

Вперёд: Программный код

help/expressions.1672490358.txt.gz · Последние изменения: 2022/12/31 12:39 — aleks_versus