ОПЕРАТОРЫ МАКРОКОМАНД Аппарат макрокоманд в том виде, как он был описан до сих пор, позволяет подставлять последовательности команд вместо макровызовов, причем все обращения к макроопределению будут заменены идентичными последовательностями команд. Такой аппарат недостаточно гибок: в макровызове нет средств модифицировать коды, которые его заменяют. Существенное расширение возможностей макросредств достигается добавлением операндов (параметров) макрокоманд. Рассмотрим следующую программу: Пример 2: . . . SetPrevPos; MoveToMark(1); CenterFixScreenPos; . . . SetPrevPos; MoveToMark(2); CenterFixScreenPos; . . . В данном случае последовательности команд очень похожи, но не абсолютно идентичны. В первой последовательности используется операнд “1”, а во втором - операнд “2”. Можно считать, что они выполняют одну и ту же операцию с переменным параметром, или операндом. Такой параметр называют “операндом макрокоманды” или “формальным параметром”, и он обычно объявляется в той же строке, где и имя макроса. В случае работы с языком макроассемблера, он обычно помечается символом &, что отличает его как символ макроязыка от символов ассемблера. В нашем случае, фирма Борланд не предусмотрела в своем макроязыке работы с макрооперандами, однако можно предположить, что если бы макроопределения в языке TEMC могли бы обрабатывать подобную ситуацию, то формат макроопределения мог бы выглядеть следующим образом: MACRO () ----------------- ----------------- ----------------- END; где это перечисление через запятую всех операндов макроса. Предыдущая программа в таком случае может быть переписана следующим образом: Исходный текст Расширение исходного текста MACRO MacGoto(labelno) SetPrevPos; MoveToMark(labelno); CenterFixScreenPos; END; . . . MacGoto(1) . . . MacGoto(2) . . . . . . SetPrevPos; MoveToMark(1); CenterFixScreenPos; . . . SetPrevPos; MoveToMark(2); CenterFixScreenPos; . . .
Следует заметить, что макрокоманда может иметь и более одного операнда. Каждый операнд должен при этом соответствовать формальному параметру в строке определения имени макроса. Рассмотрим следующий пример: Пример 3: . . . ScrollScreenDown; ScrollScreenLeft(0); FixCursorPos; . . . ScrollScreenUp; ScrollScreenLeft(1); FixCursorPos; . . . В данном случае операнды в исходных последовательностях команд различны, как и команды. Эта программа может быть переписана так: Исходный текст Расширение исходного текста MACRO MacMove(cmd,left) cmd; ScrollScreenLeft(left); FixCursorPos; END; . . . MacMove(ScrollScreenDown,0) . . . MacMove(ScrollScreenUp,1) . . ScrollScreenDown; ScrollScreenLeft(0); FixCursorPos; . . . ScrollScreenUp; ScrollScreenLeft(1); FixCursorPos; . . .
Следует отметить, что существует два основных способа задания операндов. Первый способ - позиционный показан в вышестоящем примере. Существует также способ указания с применением ключевых операндов , который позволяет обращаться к формальным операторам, как по именам так и по позиции. Ссылаясь на формальные операторы в определении MacMove можно также использовать следующий вызов: MacMove(cmd=ScrollScreenUp,left=1) УСЛОВНОЕ МАКРОРАСШИРЕНИЕ Иногда возникают потребности изменять порядок команд макрорасширения внутри макроса. Рассмотрим следующую программу: Пример 4: . . . ScrollScreenLeft(1); LiteralChar('-'); . . . ScrollScreenDown; ScrollScreenLeft(2); LiteralChar('*'); . . . В этом примере не только параметры, но и количество команд - переменная величина. Эта программа может быть записана следующим образом:
. . . MACRO Mac1(p1,left,chr) IF p1==1 THEN ScrollScreenDown; ENDIF ScrollScreenLeft(2); LiteralChar('*'); END . . . Mac1(1,2,’-’) . . . Mac1(0,1,’*’) . . . . . . ScrollScreenLeft(1); LiteralChar('-'); . . . ScrollScreenDown; ScrollScreenLeft(2); LiteralChar('*'); . . . Комбинация IF...THEN...ELSE является макрометками или символами следования и не появляются в выходном тексте макропроцессора. В макроязыке также могут быть предусмотрены псевдокоманды условного и безусловного перехода на псевдо-метку, с которой макропроцессор продолжит обработку текста программы. Точно так же, как и в случае выполнения программы, операторы переходов служат для указания выполнения операторов программы, операторы макро-переходов служат для указания порядка компиляции текста программы. Это дает возможность в процессе расширения получать конкретные варианты последовательностей команд, соответствующие данному случаю применения макрокоманды. Выполнение переходов и проверок внутри выполняемого кода увеличивает его размер и время выполнения, в то время, как проверка и переходы в макросах происходят на стадии компиляции и поэтому не требуют затрат времени при выполнении кода. Эта возможность избирательной выборки нужных частей текста является одним из самых мощных средств в системном программировании.
Рефераты по информатикеОператор, работающий в какой-либо системе, часто встречается с необходимостью повторять некоторые последовательности
Оценок: 363 (Средняя 5 из 5)
Специалисты RetsCorp работают в digital-сфере более 7 лет. За это время мы разработали более 500+ успешных проектов. Основываясь на своем опыте и знании рынка, мы с уверенностью можем сказать, что будет работать, а что — нет. Заказывая создание лендинга для бизнеса в нашей студии, вы получаете работающие решения, необходимые именно вашему бизнесу.
Сотрудничая с нами, вы будете не клиентом, а нашим партнером. Благодаря этому мы будем развивать ваш бизнес как собственный. Мы так же как и вы заинтересованы в успехе проекта, поскольку ваша успешность будет нашей рекламой.