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

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


help:dynamical

Различия

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

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

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
help:dynamical [2023/01/03 11:09]
aleks_versus переписано
help:dynamical [2024/10/14 12:17] (текущий)
aleks_versus
Строка 1: Строка 1:
- 
 [[help:​service_locations|Назад:​ Служебные локации]] [[help:​service_locations|Назад:​ Служебные локации]]
  
 ====== Динамический код ====== ====== Динамический код ======
- 
  
 ===== Лирическое вступление,​ поясняющее,​ для чего может пригодиться динамический код ===== ===== Лирическое вступление,​ поясняющее,​ для чего может пригодиться динамический код =====
  
-В силу ​своей линейности язык **QSP** лишён определённых возможностей, присущих ​другим языкам программирования. Например,​ если вам нужно вывести на печать массив,​ вы делаете это с помощью цикла:+Из-за ​своей линейности язык **QSP** лишён ​некоторых ​плюшек,​ которые есть в других языках программирования. Например,​ если вам нужно вывести на печать массив,​ вы делаете это с помощью цикла:
  
 <sxh qsp> <sxh qsp>
 ! массив mass создан заранее ! массив mass создан заранее
 loop local i,​size=0,​arrsize('​mass'​) while i<size step i+=1: loop local i,​size=0,​arrsize('​mass'​) while i<size step i+=1:
- *pl mass[i]+  ​*pl mass[i]
 end end
 </​sxh>​ </​sxh>​
Строка 22: Строка 20:
 И вот для этого нам потребуется использовать динамический код. И вот для этого нам потребуется использовать динамический код.
  
-(на самом деле у этой задачи есть решение и без применения оператора ''​**DYNAMIC**'',​ но сейчас нас интересует именно динамический код, поэтому продолжим в рамках нужного для примера решения).+(на самом деле у этой задачи есть решение и без применения оператора ''​%%DYNAMIC%%'',​ но сейчас нас интересует именно динамический код, поэтому продолжим в рамках нужного для примера решения).
  
 Динамический код — это код, который мы не знаем заранее. Мы пишем лишь его составные части, а уже при выполнении программы этот код составляется из этих частей в нужные комбинации. Динамический код — это код, который мы не знаем заранее. Мы пишем лишь его составные части, а уже при выполнении программы этот код составляется из этих частей в нужные комбинации.
Строка 34: Строка 32:
 <sxh qsp> <sxh qsp>
 "loop local i,​size=0,​arrsize('​mass'​) while i<size step i+=1: "loop local i,​size=0,​arrsize('​mass'​) while i<size step i+=1:
- *pl mass[i]+  ​*pl mass[i]
 end" end"
 </​sxh>​ </​sxh>​
  
-Что мы тут видим? А видим мы, что в этой строке прописано название массива ''​**mass**'',​ аж целых два раза. Название массива — это значение,​ которое можно помещать в перемнную,​ а можно извлекать из переменной.+Что мы тут видим? А видим мы, что в этой строке прописано название массива ''​%%mass%%'',​ аж целых два раза. Название массива — это значение,​ которое можно помещать в перемнную,​ а можно извлекать из переменной.
  
-Например,​ мы поместили название массива в переменную ''​**$array_name**''​. Как нам вставить значение этой переменной в наш код, записанный в виде строки?​ Используем подвыражения:​+Например,​ мы поместили название массива в переменную ''​%%$array_name%%''​. Как нам вставить значение этой переменной в наш код, записанный в виде строки?​ Используем подвыражения:​
  
 <sxh qsp> <sxh qsp>
 $array_name='​mass'​ $array_name='​mass'​
 "loop local i,​size=0,​arrsize('<<​$array_name>>'​) while i<size step i+=1: "loop local i,​size=0,​arrsize('<<​$array_name>>'​) while i<size step i+=1:
- *pl <<​$array_name>>​[i]+  ​*pl <<​$array_name>>​[i]
 end" end"
 </​sxh>​ </​sxh>​
  
-Если мы запустим получившуюся локацию,​ мы увидим на экране наш цикл с массивом **mass**. Если мы пропишем в переменную ''​**$array_name**''​ название другого массива,​ и снова запустим локацию,​ мы увидим на экране тот же цикл, но с другим массивом. Это значит,​ что наша строка текста формируется **динамически**!+Если мы запустим получившуюся локацию,​ мы увидим на экране наш цикл с массивом **mass**. Если мы пропишем в переменную ''​%%$array_name%%''​ название другого массива,​ и снова запустим локацию,​ мы увидим на экране тот же цикл, но с другим массивом. Это значит,​ что наша строка текста формируется **динамически**!
  
 Получается,​ и код цикла формируется динамически. Нам осталось только научиться запускать на выполнение такой код, записанный в виде строки текста. Получается,​ и код цикла формируется динамически. Нам осталось только научиться запускать на выполнение такой код, записанный в виде строки текста.
  
-И вот для этого, как раз, в **QSP** есть специальный оператор:​ ''​**DYNAMIC**''​. Мы просто передаём этому оператору наш записанный в виде текста цикл, и оператор ''​**DYNAMIC**''​ легко его выполняет,​ как обычный код QSP:+И вот для этого, как раз, в **QSP** есть специальный оператор:​ ''​%%DYNAMIC%%''​. Мы просто передаём этому оператору наш записанный в виде текста цикл, и оператор ''​%%DYNAMIC%%''​ легко его выполняет,​ как обычный код QSP:
  
 <sxh qsp> <sxh qsp>
 $array_name='​mass'​ $array_name='​mass'​
 dynamic "loop local i,​size=0,​arrsize('<<​$array_name>>'​) while i<size step i+=1: dynamic "loop local i,​size=0,​arrsize('<<​$array_name>>'​) while i<size step i+=1:
- *pl <<​$array_name>>​[i]+  ​*pl <<​$array_name>>​[i]
 end" end"
 </​sxh>​ </​sxh>​
  
-Таким образом,​ заменяя значение в переменной ''​**$array_name**'',​ мы легко выводим на печать любой массив. А чтобы нам было ещё проще, мы создаём специальную локацию-функцию,​ и ей, в качестве аргументов,​ будем передавать названия массивов,​ которые хотим распечатать. Назовём эту локацию ''​**print_array**'':​+Таким образом,​ заменяя значение в переменной ''​%%$array_name%%'',​ мы легко выводим на печать любой массив. А чтобы нам было ещё проще, мы создаём специальную локацию-функцию,​ и ей, в качестве аргументов,​ будем передавать названия массивов,​ которые хотим распечатать. Назовём эту локацию ''​%%print_array%%'':​
  
 <sxh qsp> <sxh qsp>
 !# print_array !# print_array
 dynamic "loop local i,​size=0,​arrsize('<<​$args[0]>>'​) while i<size step i+=1: dynamic "loop local i,​size=0,​arrsize('<<​$args[0]>>'​) while i<size step i+=1:
- *pl <<​$args[0]>>​[i]+  ​*pl <<​$args[0]>>​[i]
 end" end"
 </​sxh>​ </​sxh>​
Строка 83: Строка 81:
 ===== DYNAMIC ===== ===== DYNAMIC =====
  
-''​**DYNAMIC**''​ — выполняет код, переданный в виде строки текста. Общая запись:​+''​%%DYNAMIC%%''​ — выполняет код, переданный в виде строки текста. Общая запись:​ 
 <sxh qsp> <sxh qsp>
 DYNAMIC [$код],​[аргумент 0],​[аргумент 1], ... ,​[аргумент 18] DYNAMIC [$код],​[аргумент 0],​[аргумент 1], ... ,​[аргумент 18]
 </​sxh>​ </​sxh>​
-, где ''​**[$код]**''​ — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода оператора ''​**GOSUB**''​. Аргументы ''​**[аргумент 0]**'',​ ''​**[аргумент 1]**''​ и т.д. могут использоваться внутри ''​**[$код]**'',​ их значения автоматически помещаются в ячейки массива ''​ARGS[0]'',​ ''​ARGS[1]'',​ и т.д. соответственно. Внутри выполняемого кода ''​**DYNAMIC**''​ используется свой собственный массив ''​**ARGS**'',​ его значения не пересекаются со значениями ''​**ARGS**''​ на локации,​ из которой ''​**DYNAMIC**''​ был вызван. После выполнения кода, переданного оператору ''​**DYNAMIC**'',​ продолжается выполнение кода со следующей команды после ''​**DYNAMIC**''​.+ 
 +, где ''​%%[$код]%%''​ — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода оператора ''​%%GOSUB%%''​. Аргументы ''​%%[аргумент 0]%%'',​ ''​%%[аргумент 1]%%''​ и т.д. могут использоваться внутри ''​%%[$код]%%'',​ их значения автоматически помещаются в ячейки массива ''​%%args%%'':​ в ''​%%ARGS[0]%%'',​ ''​%%ARGS[1]%%'',​ и т.д. соответственно. Внутри выполняемого кода ''​%%DYNAMIC%%''​ используется свой собственный массив ''​%%ARGS%%'',​ его значения не пересекаются со значениями ''​%%ARGS%%''​ на локации,​ из которой ''​%%DYNAMIC%%''​ был вызван. После выполнения кода, переданного оператору ''​%%DYNAMIC%%'',​ продолжается выполнение кода со следующей команды после ''​%%DYNAMIC%%''​.
  
 Примеры:​ Примеры:​
 +
 <sxh qsp> <sxh qsp>
 ! простые вызовы кода, записанного в виде текста ! простые вызовы кода, записанного в виде текста
Строка 97: Строка 98:
 ! вызов кода с передачей в него аргументов ! вызов кода с передачей в него аргументов
 dynamic " dynamic "
- *pl $args[0] +  ​*pl $args[0] 
- addobj $args[1]+  addobj $args[1]
 ",'​Вы взяли вилку.','​Вилка'​ ",'​Вы взяли вилку.','​Вилка'​
 </​sxh>​ </​sxh>​
-Нижеследующая информация справедлива и для функции ''​**DYNEVAL**''​ (см. ниже). 
  
-**Важно!** Если код задан с помощью одинарных (''​**' '**''​) или двойных (''​**" "**''​) кавычек,​ подвыражения вычисляются сразу:+Нижеследующая информация справедлива и для функции ''​%%DYNEVAL%%''​ (см. ниже). 
 + 
 +**Важно!** Если код задан с помощью одинарных (''​%%' '%%''​) или двойных (''​%%" "%%''​) кавычек,​ подвыражения вычисляются сразу: 
 <sxh qsp> <sxh qsp>
 $args[0]='​qwerty'​ $args[0]='​qwerty'​
 $code = ' $code = '
- *pl "<<​$args[0]>>"​ +  ​*pl "<<​$args[0]>>"​ 
- *pl $args[0]+  *pl $args[0]
 ' '
  
 dynamic $code,'​asdfg'​ dynamic $code,'​asdfg'​
-</​sxh>​  +</​sxh>​ 
-В этом случае при задании переменной **$code** будет вычислено подвыражение,​ поэтому когда ''​**DYNAMIC**''​ выполнит код, первой строкой выведется '​qwerty',​ второй строкой выведется '​asdfg'​.+ 
 +В этом случае при задании переменной **$code** будет вычислено подвыражение,​ поэтому когда ''​%%DYNAMIC%%''​ выполнит код, первой строкой выведется '​qwerty',​ второй строкой выведется '​asdfg'​.
  
 Фигурные скобки - третий вид кавычек используемый специально для написания динамического кода. Здесь поддерживается вложенность скобок,​ а подвыражения не вычисляются:​ Фигурные скобки - третий вид кавычек используемый специально для написания динамического кода. Здесь поддерживается вложенность скобок,​ а подвыражения не вычисляются:​
 +
 <sxh qsp> <sxh qsp>
 $args[0]='​qwerty'​ $args[0]='​qwerty'​
 $code = { $code = {
- *pl "<<​$args[0]>>"​ +  ​*pl "<<​$args[0]>>"​ 
- *pl $args[0]+  *pl $args[0]
 } }
  
 dynamic $code,'​asdfg'​ dynamic $code,'​asdfg'​
-</​sxh>​  +</​sxh>​ 
-В этом случае будут выведены две строки '​asdfg'​. Так как подвыражение не вычисляется на момент присвоения кода переменной **$code**, но зато будет вычислено уже при непосредственном выполнении кода оператором ''​**DYNAMIC**''​.+ 
 +В этом случае будут выведены две строки '​asdfg'​. Так как подвыражение не вычисляется на момент присвоения кода переменной **$code**, но зато будет вычислено уже при непосредственном выполнении кода оператором ''​%%DYNAMIC%%''​.
  
 ===== DYNEVAL ===== ===== DYNEVAL =====
  
-''​**DYNEVAL**''​ —  выполняет код, переданный в виде строки текста,​ и возвращает результат,​ если он есть. Общая запись:​+''​%%DYNEVAL%%''​ — выполняет код, переданный в виде строки текста,​ и возвращает результат,​ если он есть. Общая запись:​
  
 <sxh qsp> <sxh qsp>
Строка 135: Строка 141:
 DYNEVAL([$код],​[аргумент 0],​[аргумент 1], ... ,​[аргумент 18]) DYNEVAL([$код],​[аргумент 0],​[аргумент 1], ... ,​[аргумент 18])
 </​sxh>​ </​sxh>​
-, где ''​**[$код]**''​ — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода функции ''​**FUNC**''​. Аргументы ''​**[аргумент 0]**'',​ ''​**[аргумент 1]**''​ и т.д. могут использоваться внутри ''​**[$код]**'',​ их значения автоматически помещаются в массив ''​**ARGS**'',​ в ячейки ''​ARGS[0]'',​ ''​ARGS[1]'',​ и т.д. соответственно. Внутри выполняемого кода ''​**DYNEVAL**''​ используется свой собственный массив ''​**ARGS**'',​ его значения не пересекаются со значениями ''​**ARGS**''​ на локации,​ из которой ''​**DYNEVAL**''​ была вызвана. После выполнения кода, переданного функции ''​**DYNEVAL**'',​ продолжается вычисление выражения,​ в котором расположена функция ''​**DYNEVAL**''​. 
  
-Чтобы ''​**DYNEVAL**''​ возвращала результат,​ необходимо внутри ''​**[$код]**''​ присвоить этот результат переменной ''​**RESULT**''​.+, где ''​%%[$код]%%''​ — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода функции ''​%%FUNC%%''​. Аргументы ''​%%[аргумент 0]%%'',​ ''​%%[аргумент 1]%%''​ и т.д. могут использоваться внутри ''​%%[$код]%%'',​ их значения автоматически помещаются в массив ''​%%ARGS%%'',​ в ячейки ''​%%ARGS[0]%%'',​ ''​%%ARGS[1]%%'',​ и т.д. соответственно. Внутри выполняемого кода ''​%%DYNEVAL%%''​ используется свой собственный массив ''​%%ARGS%%'',​ его значения не пересекаются со значениями ''​%%ARGS%%''​ на локации,​ из которой ''​%%DYNEVAL%%''​ была вызвана. После выполнения кода, переданного функции ''​%%DYNEVAL%%'',​ продолжается вычисление выражения,​ в котором расположена функция ''​%%DYNEVAL%%''​. 
 + 
 +Чтобы ''​%%DYNEVAL%%''​ возвращала результат,​ необходимо внутри ''​%%[$код]%%''​ присвоить этот результат переменной ''​%%RESULT%%''​.
  
 Примеры:​ Примеры:​
 +
 <sxh qsp> <sxh qsp>
 dyneval('​result = 3+4') dyneval('​result = 3+4')
Строка 145: Строка 153:
 проход = dyneval("​result = ($args[0] <> '​текст'​)",​ '​строка'​) проход = dyneval("​result = ($args[0] <> '​текст'​)",​ '​строка'​)
 </​sxh>​ </​sxh>​
- * Чтобы ''​**DYNEVAL**''​ вернула строковое значение,​ результат должен быть записан в ''​**$RESULT**''​. 
- * Чтобы ''​**DYNEVAL**''​ вернула числовое значение,​ результат должен быть записан в ''​**RESULT**''​. 
- * ''​**$RESULT**''​ и ''​**RESULT**''​ — это одна и та же переменная,​ но с разными типами данных. **Следует помнить**,​ что новая запись значения затирает предыдущее,​ какого бы типа данных не было это значение. 
  
-Если при выполнении ''​**DYNEVAL**''​ она не возвращает значения (''​**RESULT**''​ не инициализируется),​ и является единственным элементом выражения,​ передаваемого неявному оператору,​ плеер ничего не выведет на экран. Т.е. ''​**DYNEVAL**''​ будет работать,​ как ''​**DYNAMIC**''​. Пример:​+  * Чтобы ''​%%DYNEVAL%%''​ вернула строковое значение, результат должен быть записан в ''​%%$RESULT%%''​. 
 +  * Чтобы ''​%%DYNEVAL%%''​ вернула числовое значение,​ результат должен быть записан в ''​%%RESULT%%''​. 
 +  * Чтобы ''​%%DYNEVAL%%''​ вернула несколько значений, результат нужно записать в ''​%%%RESULT%%''​ как кортеж значений. 
 +  ​''​%%%RESULT%%'',​ ''​%%$RESULT%%''​ и ''​%%RESULT%%''​ — это одна и та же переменная,​ но с разными типами данных. ​**Следует помнить**, что новая запись значения затирает предыдущее,​ какого бы типа данных не было это значение. 
 + 
 +Если при выполнении ''​%%DYNEVAL%%''​ она не возвращает значения (''​%%RESULT%%''​ не инициализируется),​ и является единственным элементом выражения,​ передаваемого неявному оператору,​ плеер ничего не выведет на экран. Т.е. ''​%%DYNEVAL%%''​ будет работать,​ как ''​%%DYNAMIC%%''​. Пример:​
  
 <sxh qsp> <sxh qsp>
Строка 163: Строка 173:
 ===== Области применения DYNAMIC и DYNEVAL ===== ===== Области применения DYNAMIC и DYNEVAL =====
  
-''​**DYNAMIC**''​ и ''​**DYNEVAL**''​ следует использовать в нескольких случаях:​+''​%%DYNAMIC%%''​ и ''​%%DYNEVAL%%''​ следует использовать в нескольких случаях:​
  
- * Когда нет иного способа получить необходимый функционал. Как пример,​ очень распространённый случай генерации действий с помощью цикла:<​sxh qsp> +  ​* Когда нет иного способа получить необходимый функционал. Как пример,​ очень распространённый случай генерации действий с помощью цикла: <sxh qsp> 
- loop i=1 while i<=10 step i+=1: +loop i=1 while i<=10 step i+=1: 
- act "​Действие <<​i>>":​ *pl "​Действие <<​i>>"​ +  act "​Действие <<​i>>":​ *pl "​Действие <<​i>>"​ 
- end +end 
-</​sxh>​ В данном случае будут созданы действия с названиями "​Действие 1" ... "​Действие 10". Неопытный автор ожидает,​ что каждое из этих действий при щелчке по нему будет выводить собственный номер. Однако,​ это ожидание не верно. Переменная ''​**i**''​ в данном случае получит значение **10**, и в момент выполнения действия именно это значение подставится в строку,​ выводимую на экран. То есть подвыражение,​ относящееся к коду действия,​ не будет раскрыто плеером,​ пока игрок не кликнет по действию. Чтобы действительно сгенерировать действия,​ которые будут выводить свой правильный номер, раскрытие подвыражения должно происходить в момент создания действия. Как раз для этого и подойдёт оператор ''​**DYNAMIC**'':<​sxh qsp> +</​sxh>​ В данном случае будут созданы действия с названиями "​Действие 1" ... "​Действие 10". Неопытный автор ожидает,​ что каждое из этих действий при щелчке по нему будет выводить собственный номер. Однако,​ это ожидание не верно. Переменная ''​%%i%%''​ в данном случае получит значение **10**, и в момент выполнения действия именно это значение подставится в строку,​ выводимую на экран. То есть подвыражение,​ относящееся к коду действия,​ не будет раскрыто плеером,​ пока игрок не кликнет по действию.\\ 
- loop i=1 while i<=10 step i+=1: +Чтобы действительно сгенерировать действия,​ которые будут выводить свой правильный номер, раскрытие подвыражения должно происходить в момент создания действия. Как раз для этого и подойдёт оператор ''​%%DYNAMIC%%'':​ <sxh qsp> 
- dynamic 'act "​Действие <<​i>>":​ *pl "​Действие <<​i>>"'​ +loop i=1 while i<=10 step i+=1: 
- end +  dynamic 'act "​Действие <<​i>>":​ *pl "​Действие <<​i>>"'​ 
-</​sxh>​ В этом случае сначала раскроются подвыражения,​ а затем готовый код будет передан оператору ''​**DYNAMIC**''​. Таким образом сформируются дейстия с уже готовым уникальным кодом действия. +end 
- * Также ''​**DYNAMIC**''​ и ''​**DYNEVAL**''​ очень удобны,​ когда нужно выполнить некоторый многострочный код в том месте, где невозможно разместить такой многострочный код. Например,​ в гиперссылках:<​sxh qsp> +</​sxh>​ В этом случае сначала раскроются подвыражения,​ а затем готовый код будет передан оператору ''​%%DYNAMIC%%''​. Таким образом сформируются дейстия с уже готовым уникальным кодом действия. 
- $CODE={ +  * Также ''​%%DYNAMIC%%''​ и ''​%%DYNEVAL%%''​ очень удобны,​ когда нужно выполнить некоторый многострочный код в том месте, где невозможно разместить такой многострочный код. Например,​ в гиперссылках:​ <sxh qsp> 
- if no деньги<​100:​ +$CODE = { 
- addobj '​Кружка имбирного эля'​  +  if no деньги<​100:​ 
- кружка_эля+=1  +    addobj '​Кружка имбирного эля'​ 
- деньги-=100 +    кружка_эля+=1 
- *pl "Я приобрёл куржку имбирного эля."​ +    деньги-=100 
- else +    *pl "Я приобрёл куржку имбирного эля."​ 
- *pl "​Мне не хватает денег на эль."​ +  else 
- end +    *pl "​Мне не хватает денег на эль."​ 
-+  end 
- *pl "<a href='​exec:​dynamic $CODE'>​Купить кружку имбирного эля</​a>"​ +
-</​sxh>​ В этом случае переменная ''​**$CODE**''​ обязательно должна быть глобальной,​ иначе ссылка её не "​увидит"​. Однако, ​при необходимости ​использовать такой код в условиях или циклах,​ вполне можно обойтись и локальной переменной,​ чтобы код не висел в памяти:<​sxh qsp> +*pl "<a href='​exec:​dynamic $CODE'>​Купить кружку имбирного эля</​a>"​ 
- ! этот код не имеет практической пользы. Просто для примера. +</​sxh>​ В этом случае переменная ''​%%$CODE%%''​ обязательно должна быть глобальной,​ иначе ссылка её не "​увидит"​. Однако, ​если необходимо использовать такой код в условиях или циклах,​ вполне можно обойтись и локальной переменной,​ чтобы код не висел в памяти:​ <sxh qsp> 
- local $code = { +! этот код не имеет практической пользы. Просто для примера. 
- if args[0]+args[1]+args[2]+args[3]=0:​ +local $code = { 
- result=1 +  if args[0]+args[1]+args[2]+args[3]=0:​ 
- elseif args[0]+args[1]+args[2]+args[3]=4:​ +    result=1 
- result=1 +  elseif args[0]+args[1]+args[2]+args[3]=4:​ 
- else: +    result=1 
- result=0 +  else: 
- end +    result=0 
-+  end 
- loop local i=0 & local size=arrsize('​$map'​) ​while dyneval($code,​a,​b,​c,​d) ​step i+=1+
- a = rand(0,1) +loop while dyneval($code,​a,​b,​c,​d):​ 
- b = rand(0,1) +  a = rand(0,1) 
- c = rand(0,1) +  b = rand(0,1) 
- d = rand(0,1) +  c = rand(0,1) 
- end +  d = rand(0,1) 
-</​sxh>​ В своём роде это способ создавать анонимные функции в QSP. +end 
- * Ещё ''​**DYNAMIC**''​ очень удобен для разного рода [[help:​debugger|отладчиков]],​ поскольку позволяет выполнять код QSP, введённый в строку ввода безо всяких танцев с бубном. +</​sxh>​ В своём роде это способ создавать анонимные функции в QSP. 
- * ''​**DYNAMIC**''​ позволяет восстанавливать действия,​ полученные с помощью функции ''​**$CURACTS**'':<​sxh qsp> +  * Ещё ''​%%DYNAMIC%%''​ очень удобен для разного рода [[help:​debugger|отладчиков]],​ поскольку позволяет выполнять код QSP, введённый в строку ввода безо всяких танцев с бубном. 
- $acts = $curacts +  * ''​%%DYNAMIC%%''​ позволяет восстанавливать действия,​ полученные с помощью функции ''​%%$CURACTS%%'',​ и предметы,​ полученные с помощью функции ''​%%$CUROBJS%%'':​ <sxh qsp> 
- cla +$acts = $curacts 
- dynamic $acts+cla 
 +dynamic $acts
 </​sxh>​ </​sxh>​
  
-Нет смысла использовать динамический код, если вы можете получить тот же результат без его использования. Прежде чем всюду пихать ''​**DYNAMIC**''​ хорошенько подумайте,​ а не целесообразнее было бы написать этот код на отдельной локации так, чтобы не приходилось использовать ''​**DYNAMIC**''​. Динамический код сложнее читать и на него сложнее ссылаться. Он в принципе ухудшает читаемость кода.+Нет смысла использовать динамический код, если вы можете получить тот же результат без его использования. Прежде чем всюду пихать ''​%%DYNAMIC%%''​ хорошенько подумайте,​ а не целесообразнее было бы написать этот код на отдельной локации так, чтобы не приходилось использовать ''​%%DYNAMIC%%''​. Динамический код сложнее читать и на него сложнее ссылаться. Он в принципе ухудшает читаемость кода.
  
-Вполне возможно вложение динамического кода в динамический код, то есть ''​**DYNAMIC**''/''​**DYNEVAL**''​ внутри ''​**DYNAMIC**''/''​**DYNEVAL**'',​ однако это мало того, что ухудшает читаемость,​ так ещё и очень часто приводит к багам, которые трудно отловить. Банально,​ неверная закрытая кавычка внутри кода внутри кода может вызвать ошибку,​ выбиваемую вообще не понятно в какой строке локации. Тем не менее число вложений не ограничено.+Вполне возможно вложение динамического кода в динамический код, то есть ''​%%DYNAMIC%%''/''​%%DYNEVAL%%''​ внутри ''​%%DYNAMIC%%''/''​%%DYNEVAL%%'',​ однако это мало того, что ухудшает читаемость,​ так ещё и очень часто приводит к багам, которые трудно отловить. Банально,​ неверная закрытая кавычка внутри кода внутри кода может вызвать ошибку,​ выбиваемую вообще не понятно в какой строке локации. Тем не менее число вложений не ограничено.
  
 [[help:​menu|Вперёд:​ Всплывающее меню]] [[help:​menu|Вперёд:​ Всплывающее меню]]
  
help/dynamical.1672744174.txt.gz · Последние изменения: 2023/01/03 11:09 — aleks_versus