Какой есть способ правильно экстренно выбраться из кучи вложенных циклов/подпрограмм глобально ну хотя бы в «корень» скрипта?
Какие можно придумать способы? Мне пока в голову пришло только рекурсивно вызывать скрипт LOAD("скрипт.cms"). Можно ли так делать? Или это тот же досрочный выход из цикла? Я понимаю, что переменные сохраняются, а вот сбрасывается там стэк или как всё там реализовано не знаю. С программированием не знаком. В далёкие времена, для себя писал программки на ассемблере для Z80. Так там RET как раз был выход из подпрограммы. И выходов могло быть много (привет Оравэну). RET снимала с вершины стэка адрес возврата из подпрограммы. Можно было хитрым макаром, следя за стэком выскочить куда угодно из любого числа подпрограмм или вообще в любое место не нарушая работы.
Чёт я отвлёкся...
Зачем это нужно? Всегда хочется правильной, если нужно длительной и бесперебойной работы скрипта. Речь сейчас не об ошибках в скрипте (представим, что ошибок нет), а о согласовании работы скрипта и целевого приложения. Для универсальности и исключения влияния нестабильной скорости интернет соединения, параллельно работающих программ и т.д., я если необходимо ожидать реакцию целевого приложения (например игры), в большинстве мест использую цикл ожидания с проверкой пиксела/картинки/суммы и т.п.
Типа такого:
$fon = 1
WHILE($fon = 1)
GETSCREEN
IF (PXL($lx+60, $ly-137)=6643283)
$fon = 0 // выходим из цикла fon
END_IF
WAITMS(100)
END_CYC
Так вот, если с целевой программой что-то пошло не так (не отработал клик или вылезло незапланированное окно), то всё из цикла мы уже не вылазим.
Сейчас я конечно использую внутри подобного цикла проверку на время ожидания или количество циклов. Выход правда получается сильно запутанным даже при двух вложениях, а если больше, наступает Амба с растущим числом проверок и перескоков GOTO к концу циклов/подпрограмм. Короче чёрт ногу сломит если делать всё по правильному.
Если можно использовать LOAD самой себя из под кучи вложенных циклов то это хоть какой-то выход.
Пример:
#name "Рекурсия"
IF($reboot > 0)
// здесь проводится обработка ошибок если нужно и разная реакция с раздачей слонов
// перезагружаем страницу/перезапускаем приложение, топаем по метке внутрь скрипта и т.д.
//...
$reboot = 0
END_IF
// основная программа
//...
WHILE(условие1)
WHILE(условие2)
// и т.д.
GOSUB(proverka) // проводим проверку на зависание/сбой
END_CYC
END_CYC
//...
//--------------------------------
SUB (proverka)
IF(условие)
$reboot = 1
LOAD("Опыты\Рекурсия.cms")
END_IF
END_SUB
//--------------------------------
Если так нельзя, как можно? Может сделать хотя бы какой нибудь RESET который будет перезапускать скрипт с очисткой переменных и всяких входов в циклы. Короче то же что и стоп/пуск.
Если кого запутал - простите