Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:variables [2022/12/30 19:14] aleks_versus переписано полностью |
help:variables [2024/10/14 10:12] (текущий) 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> | </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: | Строка 419: | ||
! этот код последовательно выведет на экран числа 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: | Строка 460: | ||
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|Вперёд: Выражения]] | ||
- | |||