Здесь показаны различия между двумя версиями данной страницы.
| Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
|
help:variables [2022/12/30 19:14] aleks_versus переписано полностью |
help:variables [2025/10/05 07:48] (текущий) aleks_versus [Локальные переменные] |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | |||
| [[help:principle|Назад: Порядок работы интерпретатора]] | [[help:principle|Назад: Порядок работы интерпретатора]] | ||
| Строка 8: | Строка 7: | ||
| **Переменная** - это именованная "ячейка памяти". То есть это некий кусочек памяти в программе, которому мы назначаем имя. | **Переменная** - это именованная "ячейка памяти". То есть это некий кусочек памяти в программе, которому мы назначаем имя. | ||
| - | Для удобства можно представлять переменную, как коробку, в которую мы что-нибудь "складываем", например число, или фрагмент текста. | + | Для удобства можно представлять переменную, как коробку, в которую мы что-нибудь "складываем", например число, или фрагмент текста (или даже несколько значений одновременно - кортеж). |
| ===== Типы переменных ===== | ===== Типы переменных ===== | ||
| - | Память программ работает совсем не так, как наша, и "запоминать" они могут только определённого типа значения. **QSP** умеет "запоминать" только **целочисленные** и **строковые** значения. | + | Память программ работает совсем не так, как наша, и "запоминать" они могут только определённого типа значения. **QSP** умеет "запоминать" только **целочисленные** (числовые) и **строковые** значения. Особняком можно отметить **кортежи**, которые позволяют упаковать в одну переменную сразу группу значений. |
| - | Поэтому и переменные в **QSP** делятся на два типа: | + | Поэтому и переменные в **QSP** делятся на три типа: |
| - | * Целочисленные | + | |
| - | * Строковые | + | |
| - | В целочисленных переменных (иногда для краткости их называют просто числовыми) мы можем хранить только **целые** числа в пределах от -2147483648 до 2147483647. | + | * Целочисленные |
| + | * Строковые | ||
| + | * Кортежи | ||
| - | Если мы не поместили никакого значения в целочисленную переменную, то считается, что она хранит значение 0. Это **значение по умолчанию** для числовых переменных. | + | **В целочисленных переменных** (иногда для краткости их называют просто числовыми) мы можем хранить только **целые** числа в пределах от -2147483648 до 2147483647. |
| - | В строковых переменных (иногда их называют текстовыми переменными) мы можем хранить целые строки текста, и длина таких строк может доходить до двух Гигабайт текста. Строка не может превысить объём оперативной памяти. | + | Если мы не поместили никакого значения в целочисленную переменную, то считается, что она хранит значение **''0''**. Это **значение по умолчанию** для числовых переменных. |
| + | |||
| + | **В строковых переменных** (иногда их называют текстовыми переменными) мы можем хранить целые строки текста, и длина таких строк может доходить до двух Гигабайт. Строка не может превысить объём оперативной памяти. | ||
| Если мы не поместили никакого значения в строковую переменную, то считается, что она хранит пустую строку, т.е. строку совсем без символов. Это **значение по умолчанию** для строковых переменных. | Если мы не поместили никакого значения в строковую переменную, то считается, что она хранит пустую строку, т.е. строку совсем без символов. Это **значение по умолчанию** для строковых переменных. | ||
| - | В переменной можно хранить значение только одного типа! Переменные ''**$яблоко**'' и ''**яблоко**'' — это одна и та же переменная, но с разным типом значения, которое в ней хранится. | + | **В кортежах** мы можем хранить сразу группу значений, причём это могут быть значения любого из трёх типов: числовые, строковые и другие кортежи. **Не рекомендуется** создавать очень большие кортежи, хотя теоретически кортежи могут быть //очень// большими. Если вам и правда понадобится //настолько// большой кортеж, примите во внимание, что как и со строкой, объём занимаемых кортежем данных не может превысить двух Гигабайт, или объёма оперативной памяти. |
| + | |||
| + | **В переменной можно хранить значение только одного типа!** Переменные **''%яблоко''**, **''$яблоко''** и **''яблоко''** — это одна и та же переменная, но с разным типом значения, которое в ней хранится. | ||
| ===== Создание переменных и изменение их значений ===== | ===== Создание переменных и изменение их значений ===== | ||
| Строка 33: | Строка 36: | ||
| Операция присваивания в **QSP** записывается так: | Операция присваивания в **QSP** записывается так: | ||
| - | * сначала пишется имя переменной | + | |
| - | * затем ставится знак **равно** (**=**) | + | * сначала пишется имя переменной |
| - | * после знака **равно** пишется значение, которое мы хотим "записать" в переменную. | + | * затем ставится знак **равно** (**=**) |
| + | * после знака **равно** пишется значение, которое мы хотим "записать" в переменную. | ||
| Примеры: | Примеры: | ||
| Строка 42: | Строка 46: | ||
| ! переменной яблоко присваивается число 23 | ! переменной яблоко присваивается число 23 | ||
| яблоко=23 | яблоко=23 | ||
| + | |||
| ! переменной $скороговорка присваивается строка Ехал Грека Через Реку | ! переменной $скороговорка присваивается строка Ехал Грека Через Реку | ||
| - | $скороговорка='Ехал Грека Через Реку' | + | $скороговорка = 'Ехал Грека Через Реку' |
| + | |||
| + | ! переменной %unit присваивается кортеж значений | ||
| + | %unit = [187, 94, 'steel', [0, 2]] | ||
| </sxh> | </sxh> | ||
| - | Как видите, в обоих случаях сначала ставится имя переменной, потом знак равенства, а потом значение. Вместо значения можно написать название другой переменной, название функции, или даже целое выражение. Плеер автоматически вычислит **значение** из выражения, функции или переменной, и присвоит это **значение** переменной, стоящей слева от знака **равно**. | + | Как видите, во всех трёх случаях сначала ставится имя переменной, потом знак равенства, а потом значение. Вместо значения можно написать название другой переменной, название функции, или даже целое выражение. Плеер автоматически вычислит **значение** из выражения, функции или переменной, и присвоит это **значение** переменной, стоящей слева от знака **равно**. Примеры: |
| - | Примеры: | + | |
| <sxh qsp> | <sxh qsp> | ||
| ! присваиваем переменной значение другой переменной | ! присваиваем переменной значение другой переменной | ||
| $скороговорка_про_Греку = $скороговорка | $скороговорка_про_Греку = $скороговорка | ||
| + | |||
| ! присваиваем переменной значение выражения | ! присваиваем переменной значение выражения | ||
| яблоко = яблоки_в_кармане + яблоки_в_лукошке + яблоки_у_Лёшки | яблоко = яблоки_в_кармане + яблоки_в_лукошке + яблоки_у_Лёшки | ||
| + | |||
| ! присваиваем переменной значение функции | ! присваиваем переменной значение функции | ||
| случайное_число = rnd | случайное_число = rnd | ||
| Строка 59: | Строка 68: | ||
| </sxh> | </sxh> | ||
| - | Не путайте операцию присваивания, и операцию сравнения. Их запись похожа, но операция сравнения обычно следует за ключевыми словами ''**IF**'', ''**ELSEIF**'' или ''**WHILE**'' и позволяет сравнивать одно значение с другим. | + | Не путайте операцию присваивания, и операцию сравнения. Их запись похожа, но операция сравнения обычно следует за ключевыми словами **''IF''**, **''ELSEIF''** или **''WHILE''** и позволяет сравнивать одно значение с другим. |
| ==== Множественное присваивание ==== | ==== Множественное присваивание ==== | ||
| Вы можете одной командой присвоить значения сразу нескольким переменным (множественное присваивание). Для этого: | Вы можете одной командой присвоить значения сразу нескольким переменным (множественное присваивание). Для этого: | ||
| - | * сначала перечисляете через запятую несколько имён переменных | + | |
| - | * затем ставите знак **равно** (**=**) | + | * сначала перечисляете через запятую несколько имён переменных |
| - | * после знака **равно** так же через запятую перечисляете значения, которые хотите назначить переменным. | + | * затем ставите знак **равно** (**=**) |
| + | * после знака **равно** так же через запятую перечисляете значения, которые хотите назначить переменным. | ||
| Примеры: | Примеры: | ||
| + | |||
| <sxh qsp> | <sxh qsp> | ||
| яблоки_в_кармане, яблоки_в_лукошке, яблоки_у_Лёшки = 58, 11, 19 | яблоки_в_кармане, яблоки_в_лукошке, яблоки_у_Лёшки = 58, 11, 19 | ||
| Строка 81: | Строка 92: | ||
| <sxh qsp> | <sxh qsp> | ||
| ! три переменные = три значения | ! три переменные = три значения | ||
| - | red,green,blue = rand(0,255), rand(0,255), rand(0,255) | + | red, green, blue = rand(0,255), rand(0,255), rand(0,255) |
| ! две переменные = два значения | ! две переменные = два значения | ||
| яблоки_в_кармане, яблоки_в_лукошке = яблоки_у_Лёшки, яблоки_на_дереве+15 | яблоки_в_кармане, яблоки_в_лукошке = яблоки_у_Лёшки, яблоки_на_дереве+15 | ||
| Строка 115: | Строка 126: | ||
| <sxh qsp> | <sxh qsp> | ||
| ! так неправильно: | ! так неправильно: | ||
| - | raz=24, dva=67, tri=89 | + | raz = 24, dva = 67, tri = 89 |
| ! а вот так правильно | ! а вот так правильно | ||
| raz, dva, tri = 24, 67, 89 | raz, dva, tri = 24, 67, 89 | ||
| ! и вот так правильно, потому что здесь три команды записаны в одну строку | ! и вот так правильно, потому что здесь три команды записаны в одну строку | ||
| - | raz=24 & dva=67 & tri=89 | + | raz = 24 & dva = 67 & tri = 89 |
| </sxh> | </sxh> | ||
| + | |||
| + | ==== Присваивание из кортежа (распаковка) ==== | ||
| + | |||
| + | Поскольку кортежи содержат в себе сразу несколько значений, запись присваивания значений переменным из кортежа может показаться необычной: | ||
| + | |||
| + | <sxh qsp> | ||
| + | ! %unit = [187, 94, 'steel', [0, 2]] | ||
| + | рост, вес, $материал, %координаты = %unit | ||
| + | </sxh> | ||
| + | |||
| + | Как видите, здесь у нас слева четыре имени переменной, а справа только одно имя переменной-кортежа. Такое присваивание называется **распаковкой** — значения извлекаются из кортежа и помещаются в указанные переменные. | ||
| + | |||
| + | Точно так же распаковывается кортеж, даже не помещённый в переменную: | ||
| + | |||
| + | <sxh qsp> | ||
| + | рост, вес, $материал, %координаты = [187, 94, 'steel', [0, 2]] | ||
| + | </sxh> | ||
| + | |||
| + | Такая запись мало чем отличается от множественного присваивания, поэтому внешние квадратные скобки не обязательны: | ||
| + | |||
| + | <sxh qsp> | ||
| + | рост, вес, $материал, %координаты = 187, 94, 'steel', [0, 2] | ||
| + | </sxh> | ||
| + | |||
| + | Подробнее о работе с кортежами, читайте в [[help:tuples|соответствующем разделе]]. | ||
| ==== Операторы SET и LET ==== | ==== Операторы SET и LET ==== | ||
| - | Из старых версий плеера перекочевали операторы ''**SET**'' и ''**LET**''. Эти операторы явно указывают, что данная команда производит присваивание. Любой из этих операторов может быть поставлен перед операцией присваивания, это никак не влияет на работу переменных. В примере ниже все три варианта присваивания значения переменным равнозначны: | + | Из старых версий плеера перекочевали операторы **''SET''** и **''LET''**. Эти операторы явно указывают, что данная команда производит присваивание. Любой из этих операторов может быть поставлен перед операцией присваивания, это никак не влияет на работу переменных. В примере ниже все три варианта присваивания значения переменным равнозначны: |
| <sxh qsp> | <sxh qsp> | ||
| Строка 132: | Строка 168: | ||
| </sxh> | </sxh> | ||
| - | Точно так же, как и в операции присваивания без операторов ''**SET**'' и ''**LET**'', можно присваивать значения сразу нескольким переменным одной командой и с использованием операторов: | + | Точно так же, как и в операции присваивания без операторов **''SET''** и **''LET''**, можно присваивать значения сразу нескольким переменным одной командой и с использованием операторов: |
| <sxh qsp> | <sxh qsp> | ||
| Строка 140: | Строка 176: | ||
| </sxh> | </sxh> | ||
| - | Для улучшения читаемости кода можно использовать оператор ''**SET**'', или оператор ''**LET**'', только для команд с множественным присваиванием. | + | Для улучшения читаемости кода можно использовать оператор **''SET''** только для команд с множественным присваиванием. |
| + | |||
| + | Оператор **''LET''** использовать не рекомендуется. | ||
| ==== Изменение типа переменной ==== | ==== Изменение типа переменной ==== | ||
| Строка 165: | Строка 203: | ||
| Чтобы не сбивать плеер с толку, названия переменных должны соответствовать следующим условиям: | Чтобы не сбивать плеер с толку, названия переменных должны соответствовать следующим условиям: | ||
| - | * Название переменной **не** должно **начинаться с цифры**. | + | |
| - | * Оно не должно совпадать с ключевыми словами (cм. [[help:keywords|список ключевых слов]]). | + | * Название переменной **не** должно **начинаться с цифры**. |
| - | * В названии не должны использоваться пробелы, символы табуляции и следующие символы:<sxh> | + | * Оно не должно совпадать с ключевыми словами (cм. [[help:keywords|список ключевых слов]]). |
| - | ! : & = < > + - * / , ' " ( ) [ ] { } | + | * В названии не должны использоваться пробелы, символы табуляции и следующие символы: <sxh> |
| + | ! : & = < > + - * / , ' " ( ) [ ] { } @ ? ; | ||
| </sxh> | </sxh> | ||
| - | * Названия строковых переменных должны начинаться с символа ''$''. | + | * Названия строковых переменных должны начинаться с символа **''$''**. |
| - | * Регистр в названии переменной не важен: ''**деньги**'' и ''**ДеНьГи**'' - одна и та же переменная. | + | * Названия кортежей должны начинаться с символа **''%''**. |
| + | * Регистр в названии переменной не важен: **''деньги''** и **''ДеНьГи''** - одна и та же переменная. | ||
| А вот несколько рекомендаций по тому, как правильно подбирать названия переменных | А вот несколько рекомендаций по тому, как правильно подбирать названия переменных | ||
| - | * Вместо пробела в названиях можно использовать символ подчеркивания - "''_''". | + | |
| - | * Не рекомендуется делать названия длиннее 10-15 символов, это усложняет читаемость кода. | + | * Вместо пробела в названиях можно использовать символ подчеркивания - "**''_''**". |
| - | * Не стоит использовать в названии переменной **одновременно** символы разных алфавитов, это может запутать вас, и вы допустите ошибку. | + | * Не рекомендуется делать названия длиннее 10-15 символов, это усложняет читаемость кода. |
| + | * Не стоит использовать в названии переменной **одновременно** символы разных алфавитов, это может запутать вас, и вы допустите ошибку. | ||
| Используйте краткие и ёмкие названия, указывающие на назначение переменной. При этом **QSP** разрешает пользоваться символами любого алфавита: | Используйте краткие и ёмкие названия, указывающие на назначение переменной. При этом **QSP** разрешает пользоваться символами любого алфавита: | ||
| <sxh qsp> | <sxh qsp> | ||
| - | яблоки_в_кармане=3 | + | яблоки_в_кармане = 3 |
| - | $АмулетНаШее="Ожерелье Гроз" | + | $АмулетНаШее = "Ожерелье Гроз" |
| - | money_count=1037 | + | money_count = 1037 |
| - | $money_name="RUB" | + | $money_name = "RUB" |
| - | 我_拿_钥匙=1 | + | 我_拿_钥匙 = 1 |
| - | $饭碗="Rice Bowl" | + | %饭碗 = ["Rice Bowl", 'Cat-wife '] |
| </sxh> | </sxh> | ||
| ===== Удаление переменных ===== | ===== Удаление переменных ===== | ||
| - | Удалить переменную можно с помощью оператора ''**KILLVAR**''. | + | Удалить переменную можно с помощью оператора **''KILLVAR''**. |
| <sxh qsp> | <sxh qsp> | ||
| Строка 206: | Строка 247: | ||
| </sxh> | </sxh> | ||
| - | Более подробное описание оператора ''**KILLVAR**'' находится в статье про [[help:arrays|массивы]]. | + | Более подробное описание оператора **''KILLVAR''** находится в статье про [[help:arrays|массивы]]. |
| ===== Проверка существования переменной ===== | ===== Проверка существования переменной ===== | ||
| - | В **QSP** нет специальной команды для проверки существования переменных, однако в силу особенностей движка можно использовать функцию получения размера [[help:arrays|массива]] ''**ARRSIZE**''. Если функция вернёт единицу **1**, значит переменная существует; если вернёт **0**, значит переменная не существует. | + | В **QSP** нет специальной команды для проверки существования переменных, однако в силу особенностей движка можно использовать функцию получения размера [[help:arrays|массива]] **''ARRSIZE''**. Если функция вернёт единицу **1**, значит переменная существует; если вернёт **0**, значит переменная не существует. |
| <sxh qsp> | <sxh qsp> | ||
| - | яблоко=19 & ! создана переменная яблоко | + | яблоко = 19 & ! создана переменная яблоко |
| ! увидим на экране Переменная "яблоко" существует | ! увидим на экране Переменная "яблоко" существует | ||
| - | if arrsize('яблоко')=1: | + | if arrsize('яблоко') = 1: |
| - | *pl 'Переменная "яблоко" существует' | + | *pl 'Переменная "яблоко" существует' |
| else | else | ||
| - | *pl 'Переменная "яблоко" не существует' | + | *pl 'Переменная "яблоко" не существует' |
| end | end | ||
| Строка 224: | Строка 265: | ||
| ! увидим на экране Переменная "груша" не существует | ! увидим на экране Переменная "груша" не существует | ||
| if arrsize('груша')=1: | if arrsize('груша')=1: | ||
| - | *pl 'Переменная "груша" существует' | + | *pl 'Переменная "груша" существует' |
| else | else | ||
| - | *pl 'Переменная "груша" не существует' | + | *pl 'Переменная "груша" не существует' |
| end | end | ||
| </sxh> | </sxh> | ||
| - | Название переменной для функции ''**ARRSIZE**'' указывается внутри кавычек и помещается в круглые скобки. Указывать символ "''$''" перед названием переменной не обязательно. Вне зависимости от типа значения, которое в этой переменной хранится, ''**ARRSIZE**'' вернёт единицу, если переменная существует: | + | Название переменной для функции **''ARRSIZE''** указывается внутри кавычек и помещается в круглые скобки. Указывать символ ''$'' или ''%'' перед названием переменной не обязательно. Вне зависимости от типа значения, которое в этой переменной хранится, **''ARRSIZE''** вернёт единицу, если переменная существует: |
| <sxh qsp> | <sxh qsp> | ||
| - | яблоко=19 & ! в переменную записано число | + | яблоко = 19 & ! в переменную записано число |
| ! обе команды ниже вернут единицу, потому что | ! обе команды ниже вернут единицу, потому что | ||
| - | ! яблоко и $яблоко - это одна и та же переменная | + | ! яблоко, $яблоко и %яблоко - это одна и та же переменная |
| *pl arrsize('яблоко') | *pl arrsize('яблоко') | ||
| *pl arrsize('$яблоко') | *pl arrsize('$яблоко') | ||
| + | *pl arrsize('%яблоко') | ||
| </sxh> | </sxh> | ||
| - | О функции ''**ARRSIZE**'' так же можно подробнее почитать в разделе [[help:arrays|"Массивы"]]. | + | О функции **''ARRSIZE''** так же можно подробнее почитать в разделе [[help:arrays|"Массивы"]]. |
| + | |||
| + | ===== Получение значений из переменных ===== | ||
| + | |||
| + | Чтобы получить значение переменной, достаточно написать её имя в выражении. | ||
| + | |||
| + | При этом, чтобы получить кортеж, нужно поставить перед именем переменной ''%'', а чтобы получить строковое значение, нужно поставить перед именем переменной ''$''. | ||
| + | |||
| + | Примеры: | ||
| + | |||
| + | <sxh qsp> | ||
| + | ! присваиваем значение одной переменной - другой | ||
| + | num = int & ! выражение здесь состоит из одной переменной | ||
| + | ! выводим значение переменной на экран | ||
| + | *pl $text &! выражение состоит из одной переменной | ||
| + | ! вычисляем куб числа, записанного в переменную и выводим на экран | ||
| + | d * d * d &! выражение состоит из двух операций умножения | ||
| + | </sxh> | ||
| + | |||
| + | **Важно!** Если мы пытаемся получить значение переменной, которая не была создана, то такая переменная вернёт значение по умолчанию: | ||
| + | * для числовых переменных значение по умолчанию ''0'' (ноль); | ||
| + | * для текстовых переменных значение по умолчанию ''""'' (пустая строка); | ||
| + | * для кортежей значение по умолчанию ''%%[]%%'' (пустой кортеж). | ||
| ===== Локальные переменные ===== | ===== Локальные переменные ===== | ||
| - | В **QSP** есть возможность сделать переменные локальными, то есть их значения будут сохраняться в пределах определённого блока кода, например, только на определённой локации или в отдельном действии. | + | В **QSP** есть возможность сделать переменные локальными, то есть их значения будут сохраняться в пределах определённого //блока кода//, например, только на определённой локации или в отдельном действии. |
| - | Чтобы объявить переменную локальной, нужно использовать ключевое слово ''**LOCAL**''. В общем виде объявление локальной переменной выглядит так: | + | Чтобы объявить переменную локальной, нужно использовать ключевое слово **''LOCAL''**. В общем виде объявление локальной переменной выглядит так: |
| <sxh qsp> | <sxh qsp> | ||
| - | LOCAL имя_переменной = [значение] | + | LOCAL имя_переменной = [значение] |
| </sxh> | </sxh> | ||
| - | Здесь ''**имя_переменной**'' — это имя переменной, которую мы объявляем, а ''[значение]'' — это любое значение, которое мы этой переменной присваиваем. Пример: | + | Здесь **''имя_переменной''** — это имя переменной, которую мы объявляем, а **''[значение]''** — это любое значение, которое мы этой переменной присваиваем. Пример: |
| <sxh qsp> | <sxh qsp> | ||
| - | ! объявляем локальную переменную **tempora** со значением **12** | + | ! объявляем локальную переменную **tempora** со значением **12** |
| - | local tempora = 12 | + | local tempora = 12 |
| </sxh> | </sxh> | ||
| - | Эта запись очень похожа на объявление переменной через оператор ''**SET**'', и точно так же, как для оператора ''**SET**'', для оператора ''**LOCAL**'' существует возможность объявить сразу несколько локальных переменных: | + | Эта запись очень похожа на объявление переменной через оператор **''SET''**, и точно так же, как для оператора **''SET''**, для оператора **''LOCAL''** существует возможность объявить сразу несколько локальных переменных: |
| <sxh qsp> | <sxh qsp> | ||
| - | ! множественное объявление локальных переменных | + | ! множественное объявление локальных переменных |
| - | local x, y, $item = 11, 19, "Старый меч" | + | local x, y, $item = 11, 19, "Старый меч" |
| </sxh> | </sxh> | ||
| - | Как видите, сразу после оператора ''**LOCAL**'' через запятую перечислены имена объявляемых переменных, затем стоит знак равенства и после него перчислены значения, которые мы присваиваем этим переменным. Число переменных слева от знака ''**=**'' и число значений справа должны совпадать. | + | Как видите, сразу после оператора **''LOCAL''** через запятую перечислены имена объявляемых переменных, затем стоит знак равенства и после него перчислены значения, которые мы присваиваем этим переменным. Число переменных слева от знака **''=''** и число значений справа должны совпадать. |
| - | Однако, в отличие от оператора ''**SET**'' оператор ''**LOCAL**'' позволяет нам назначить локальные переменные без присвоения им значений. Для этого достаточно просто перечислить после оператора ''**LOCAL**'' через запятую названия переменных: | + | Однако, в отличие от оператора **''SET''** оператор **''LOCAL''** позволяет нам назначить локальные переменные без присвоения им значений. Для этого достаточно просто перечислить после оператора **''LOCAL''** через запятую названия переменных: |
| <sxh qsp> | <sxh qsp> | ||
| Строка 274: | Строка 338: | ||
| </sxh> | </sxh> | ||
| - | Здесь оператор ''**LOCAL**'' работает без операции присваивания. Локальные переменные создаются, но содержат значения по умолчанию. | + | Здесь оператор **''LOCAL''** работает без операции присваивания. Локальные переменные создаются, но **''arrsize''** для них покажет **''0''**. |
| Собственные локальные переменные можно создавать для таких блоков кода как: | Собственные локальные переменные можно создавать для таких блоков кода как: | ||
| - | * Локации сами со себе. | ||
| - | * Код, передаваемый оператору ''**DYNAMIC**'' или функции ''**DYNEVAL**'' в виде текста. | ||
| - | * Код, выполняемый при нажатии на гиперссылку. | ||
| - | * Код каждого отдельного Действия (**[[help:acts|ACT]]**). | ||
| - | * Код каждого отдельного Цикла (**[[help:cycle|LOOP]]**) | ||
| - | **Внимание!** У локальных переменных есть одна особенность, которую нужно очень чётко понимать. Значение объявленной в данном блоке кода локальной переменной транслируется и во все вложенные, или вызванные из данного, блоки кода. Например, если на локации объявлена локальная переменная, то её значение транслируется во все вызываемые с помощью ''**GOSUB**'' или ''**FUNC**'' локации, в блоки кода для ''**DYNAMIC**''/''**DYNEVAL**'', в блоки циклов и так далее. Пример: | + | * Локации сами со себе. |
| + | * Код, передаваемый оператору **''DYNAMIC''** или функции **''DYNEVAL''** в виде текста. | ||
| + | * Код, выполняемый при нажатии на гиперссылку. | ||
| + | * Код каждого отдельного Действия (**[[help:acts|ACT]]**). | ||
| + | * Код каждого отдельного Цикла (**[[help:cycle|LOOP]]**) | ||
| + | |||
| + | **Внимание!** У локальных переменных есть одна особенность, которую нужно очень чётко понимать. Значение объявленной в данном блоке кода локальной переменной транслируется и во все вложенные, или вызванные из данного, блоки кода. Например, если на локации объявлена локальная переменная, то её значение транслируется во все вызываемые с помощью **''GOSUB''** или **''FUNC''** локации, в блоки кода для **''DYNAMIC''**/**''DYNEVAL''**, в блоки циклов и так далее. Пример: | ||
| <sxh qsp> | <sxh qsp> | ||
| # start | # start | ||
| - | ! из этой локации мы будем вызывать локацию foo | + | ! из этой локации мы будем вызывать локацию foo |
| - | i=99 & ! объявляем глобальную переменную | + | i=99 & ! объявляем глобальную переменную |
| - | gosub 'foo' | + | gosub 'foo' |
| - | *nl i & ! на экране увидим число 99 | + | *nl i & ! на экране увидим число 99 |
| - | --- start --- | + | -- start - |
| # foo | # foo | ||
| - | ! на этой локации объявляем локальную переменную | + | ! на этой локации объявляем локальную переменную |
| - | local i=0 | + | local i=0 |
| - | ! локальная переменная транслируется в цикл | + | ! локальная переменная транслируется в цикл |
| - | loop while i<10 step i+=1: | + | loop while i<10 step i+=1: |
| - | ! в цикле мы вызываем локацию undo | + | ! в цикле мы вызываем локацию undo |
| - | gosub 'undo' | + | gosub 'undo' |
| - | ! и так же в цикле мы работаем с переменной, | + | ! и так же в цикле мы работаем с переменной, |
| - | ! объявленной на локации foo | + | ! объявленной на локации foo |
| - | end | + | end |
| - | *nl i & ! на экране увидим число 10 | + | *nl i & ! на экране увидим число 10 |
| - | --- foo --- | + | -- foo - |
| # undo | # undo | ||
| - | ! в эту локацию из цикла с локации foo | + | ! в эту локацию из цикла с локации foo |
| - | ! транслируется всё та же локальная переменная | + | ! транслируется всё та же локальная переменная |
| - | ! объявленная на локации foo | + | ! объявленная на локации foo |
| - | i+=1 & ! увеличиваем значение переменной, влияя на значение в foo | + | i+=1 & ! увеличиваем значение переменной, влияя на значение в foo |
| - | *p 'undo:<<i>>, ' & ! на экране появятся числа 1,3,5,7,9 с припиской undo: | + | *p 'undo:<<i>>, ' & ! на экране появятся числа 1,3,5,7,9 с припиской undo: |
| - | --- undo --- | + | -- undo - |
| </sxh> | </sxh> | ||
| - | Однако! Значения локальных переменных не транслируются в действия (в отличие от значений массива ''**ARGS**'' на текущей локации): | + | **Однако!** Значения локальных переменных не транслируются в действия и гиперссылки (в отличие от значений массива **''ARGS''** на текущей локации): |
| <sxh qsp> | <sxh qsp> | ||
| - | $args[0]='текущая локация' | + | $args[0] = 'текущая локация' |
| - | local $var='локальная переменная' | + | local $var = 'локальная переменная' |
| *pl $args[0] | *pl $args[0] | ||
| *pl $var | *pl $var | ||
| act "Вывести значения": | act "Вывести значения": | ||
| - | *pl $args[0] | + | *pl $args[0] |
| - | *pl $var | + | *pl $var |
| end | end | ||
| + | </sxh> | ||
| + | |||
| + | **Важно.** Значения локальных переменных не передаются в локации-обработчики событий, однако передаются на локации-обработчики пунктов меню. Будьте внимательны. | ||
| + | |||
| + | **Ещё одна ОЧЕНЬ важная особенность!** При объявлении локальной переменной вы можете присвоить ей значение глобальной переменной, или локальной переменной объявленной в предыдущем блоке кода. Пример кода, который последовательно выведет числа 200, 113, 99: | ||
| + | |||
| + | <sxh qsp> | ||
| + | # start | ||
| + | |||
| + | a = 99 | ||
| + | @foo | ||
| + | *pl a &! на экране появится 99 | ||
| + | |||
| + | -- start | ||
| + | |||
| + | # foo | ||
| + | |||
| + | ! здесь в выражение подставится | ||
| + | ! значение переменной a из локации start: | ||
| + | local a = a + 14 &! 99+14 | ||
| + | |||
| + | dynamic { | ||
| + | ! теперь в выражении используется | ||
| + | ! значение a из локации foo | ||
| + | local a = a + 87 | ||
| + | *pl a &! 200 | ||
| + | } | ||
| + | |||
| + | ! на экран выведется 113: | ||
| + | *pl a | ||
| + | |||
| + | -- foo | ||
| </sxh> | </sxh> | ||
| ==== Примеры назначения локальных переменных ==== | ==== Примеры назначения локальных переменных ==== | ||
| - | Две локации, на каждой из которых собственная переменная ''**i**'': | + | Две локации, на каждой из которых собственная переменная **''i''**: |
| <sxh qsp> | <sxh qsp> | ||
| # локация 1 | # локация 1 | ||
| - | if i=0: i=99 & ! значение переменной i задаётся лишь раз | + | if i=0: i=99 & ! значение переменной i задаётся лишь раз |
| - | *pl "Глобальное i = <<i>>" | + | *pl "Глобальное i = <<i>>" |
| - | act "На локацию 2": goto 'локация 2' | + | act "На локацию 2": goto 'локация 2' |
| - | --- локация 1 --- | + | - локация 1 - |
| # локация 2 | # локация 2 | ||
| - | *pl "Глобальное i = <<i>>" | + | *pl "Глобальное i = <<i>>" |
| - | local i=137 & ! значение переменной i задаётся лишь раз | + | local i=137 & ! значение переменной i задаётся лишь раз |
| - | *pl "Локальное i = <<i>>" | + | *pl "Локальное i = <<i>>" |
| - | act "На локацию 1": goto 'локация 1' | + | act "На локацию 1": goto 'локация 1' |
| - | --- локация 2 --- | + | - локация 2 - |
| </sxh> | </sxh> | ||
| Строка 352: | Строка 449: | ||
| ! этот код последовательно выведет на экран числа 12, 549 и 99, 549 | ! этот код последовательно выведет на экран числа 12, 549 и 99, 549 | ||
| # start | # start | ||
| - | x=99 | + | x=99 |
| - | z=4608 | + | z=4608 |
| - | gosub 'foo' | + | gosub 'foo' |
| - | *pl x & *pl z & ! на экран выведутся числа 99 и 549 | + | *pl x & *pl z & ! на экран выведутся числа 99 и 549 |
| - | --- start --- | + | - start - |
| # foo | # foo | ||
| - | local x & ! объявляем переменную x локальной для данной локации | + | local x & ! объявляем переменную x локальной для данной локации |
| - | x=12 & ! изменяем значение переменной x | + | x=12 & ! изменяем значение переменной x |
| - | z=549 | + | z=549 |
| - | *pl x & *pl z & ! на экран выведутся числа 12 и 549 | + | *pl x & *pl z & ! на экран выведутся числа 12 и 549 |
| - | --- foo --- | + | - foo - |
| </sxh> | </sxh> | ||
| - | Пример объявления локальных переменных в коде для ''**DYNEVAL**'' и в цикле: | + | Пример объявления локальных переменных в коде для **''DYNEVAL''** и в цикле: |
| <sxh qsp> | <sxh qsp> | ||
| - | $chkObjWord={ | + | $chkObjWord = { |
| - | ! это код, записанный в виде текста в переменную $chkObjWord | + | ! это код, записанный в виде текста в переменную $chkObjWord |
| - | ! в локальную переменную $word записываем слово, | + | ! в локальную переменную $word записываем слово, |
| - | ! по которому производим поиск | + | ! по которому производим поиск |
| - | local $word=$args[0] | + | local $word = $args[0] |
| - | loop local i = 1 while no i > countobj step i+=1: | + | loop local i = 1 while no i > countobj step i += 1: |
| - | ! используем локальную переменную i внутри цикла | + | ! используем локальную переменную i внутри цикла |
| - | ! цикл выполняется пока счётчик не превысит число предметов | + | ! цикл выполняется пока счётчик не превысит число предметов |
| - | if instr($getobj(i),$word)<>0: | + | if instr($getobj(i), $word) <> 0: |
| - | ! как только в названии очередного предмета | + | ! как только в названии очередного предмета |
| - | ! встречается рассматриваемое слово | + | ! встречается рассматриваемое слово |
| - | result = i & ! возвращаем позицию | + | result = i & ! возвращаем позицию |
| - | exit & ! закрываем функцию | + | exit & ! закрываем функцию |
| - | end | + | end |
| - | end | + | end |
| } | } | ||
| - | object_position=dyneval($chkObjWord,'граната') | + | object_position = dyneval($chkObjWord, 'граната') |
| </sxh> | </sxh> | ||
| Строка 393: | Строка 490: | ||
| i=99 | i=99 | ||
| act "Действие с локальной i": | act "Действие с локальной i": | ||
| - | local i=449933 | + | local i = 449933 |
| - | *pl i | + | *pl i |
| end | end | ||
| act "Действие с глобальной i": | act "Действие с глобальной i": | ||
| - | *pl i | + | *pl i |
| end | end | ||
| </sxh> | </sxh> | ||
| [[help:expressions|Вперёд: Выражения]] | [[help:expressions|Вперёд: Выражения]] | ||
| - | |||