Может Парсеру в купе к появлению return и break - завести аналог die() в Perl или exit()/quit() из Python?
dimolezhkin 11.05.2021 16:18
И если задать результат работы вызывающего метода можно через $caller.result, то штатного способа прекратить работу вызывающего метода нет, поэтому используется такой трюк
Я понимаю, что это чисто авторская имплементация, и чисто ситуативный и даже мастер-классовый (кстати весьма прикольный) пример, как вообще можно. Потому, что будь это цепочка вызовов, то, как я понимаю, пришлось бы прокидывать return везде и всюду (если прям включить жадину до лишних вычислений).
У Парсера же нет безусловной остановки скрипта, как die() у Perl или exit(),quit() у Python? Но при этом "не пригодилось" столько лет.
Я понимаю, что лучше стараться писать максимально последовательную логику, и стараться поменьше влетать в инверсию управления с такими кейсами, но реальность всегда сложнее.
Кстати, в документации написано, что ^break[] вне циклов - вызывает ошибку компиляции, что вполне хороший кандидат на применение его в качестве безусловной остановки скрипта и сохранением обратной совместимости.
Понятно, что чисто технически существует как минимум 2 способа реализации такого поведения:
- один, как в примере auto.p с выбросом ^return[] в контексте всех методов
- второй, что-нить типа ввести служебный код ошибки и обтравив основную точку старта в ^try{} - райзить через ^throw[] сценарий безусловной "штатной" остановки (если я все правильно представляю, как это сработает)
Но читаемость, что первого, что второго - на большом коде, скажем, такая себе. Представляю себе дебаг цепочки вызова этих остановок, или обертка всего кода сразу в ^try{} :) выглядит как "индийский патч" и сбивает с толку.