Здесь показаны различия между двумя версиями данной страницы.
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|Вперёд: Всплывающее меню]] | ||