Germany | Finland | Saint Petersburg | Drive

Block .. EndBlock

Опубликовано в M4

Во всех языках высокого уровня (из приличных) имеется конструкция программного блока. Например, в языке Pascal программный блок обрамляется зарезервированными словами BEGIN .. END, в языках семейства С открывающей и закрывающей фигурными скобками.

Зачем это нужно в QPILE?

При вычислении сложных логических условий нередко получается большое нагромождение операторов IF, когда уровень их вложенности заметно препятствует читабельности текста. При уровне вложенности свыше 4 охватить структуру операторов IF становится проблематично. Устав однажды безуспешно бороться с таким нагромождением, решил упростить себе жизнь.

Конечно, существует возможность разбить логику на отдельные блоки, оформив их в качестве функций. Однако и здесь есть подводный камень - результатом выполнения функции может быть одно значение, хотя часто модификации внутри нее подвергаются несколько переменных. Можно, конечно их компоновать внутри функции в ассоциативный массив и распаковывать после возврата из неё, но никакого улучшения читабельности (не говоря уже о быстродействии) мы не получим. Можно использовать глобальные переменные, но это совсем плохо.

Исходя из этих соображений, видится правильным путь разбиения исходного текста на программные блоки, аналогичные конструкции BEGIN .. END языка Pascal. Как этого достичь?

Крайне просто. Ранее я описывал реализацию посредством препроцессора бесконечного цикла макросом Loop. Фактически, это уже готовое решение для создания механизма программных блоков. Формулируем 2 макроса:

define(`Block',`Loop')
define(`EndBlock',`break
EndLoop')

Ничего сложного. Каждый программный блок есть цикл, который исполняется только один раз. Теперь можно компоновать логические куски кода на qpile. Кроме очевидного улучшения визуализации полученного программного кода есть второй положительный аспект (а по сути он главный). Посредством стандартного оператора BREAK, расположенного в теле блока, можно досрочно прекращать его исполнение. Таким образом, дополнительно реализуется функционал отсутствующего в qpile оператора GOTO, но с соблюдением определённых рамок приличий в его использовании, сохраняя модульную структуру. 

Правила хорошего тона подразумевают, что в макросах должна быть проверка соответствия количества операторов Block и операторов EndBlock. Необходимо отсечь ситуации, когда, например, в тексте появился EndBlock, а открывающего Block для него нет. Исполнение такого кода приведет к ошибке. Однако в нашем случае никаких усилий не требуется - все проверки этого рода уже производятся внутри макросов Loop и EndLoop. В случае каких-то несоответствий они сами выдадут нужную диагностику еще на этапе препроцессора, до момента запуска портфеля.

Добавить комментарий


Библиотека