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

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


help:variables

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

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|Вперёд:​ Выражения]]
- 
  
help/variables.1672427673.txt.gz · Последние изменения: 2022/12/30 19:14 — aleks_versus