ОПЕРАТОРЫ МАКРОКОМАНД Аппарат макрокоманд в том виде, как он был описан до сих пор, позволяет подставлять последовательности команд вместо макровызовов, причем все обращения к макроопределению будут заменены идентичными последовательностями команд. Такой аппарат недостаточно гибок: в макровызове нет средств модифицировать коды, которые его заменяют. Существенное расширение возможностей макросредств достигается добавлением операндов (параметров) макрокоманд. Рассмотрим следующую программу: Пример 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 является макрометками или символами следования и не появляются в выходном тексте макропроцессора. В макроязыке также могут быть предусмотрены псевдокоманды условного и безусловного перехода на псевдо-метку, с которой макропроцессор продолжит обработку текста программы. Точно так же, как и в случае выполнения программы, операторы переходов служат для указания выполнения операторов программы, операторы макро-переходов служат для указания порядка компиляции текста программы. Это дает возможность в процессе расширения получать конкретные варианты последовательностей команд, соответствующие данному случаю применения макрокоманды. Выполнение переходов и проверок внутри выполняемого кода увеличивает его размер и время выполнения, в то время, как проверка и переходы в макросах происходят на стадии компиляции и поэтому не требуют затрат времени при выполнении кода. Эта возможность избирательной выборки нужных частей текста является одним из самых мощных средств в системном программировании.
Рефераты по информатикеОператор, работающий в какой-либо системе, часто встречается с необходимостью повторять некоторые последовательности
Оценок: 392 (Средняя 5 из 5)
Наверняка у вас есть товары или услуги, продажа которых приносит вам максимальную прибыль. Для быстрого старта в сети вам необходимо создание посадочной страницы (одностраничного сайта), на которой будет размещена информация о маржинальных товарах/услугах интернет магазина. За 8 лет опыта разработки конверсионных страниц мы выработали оптимальную структуру, которая позволит привлекать через landing page больше продаж. На такую структуру «одевается» ваш контент — фирменный стиль, тексты, фотографии, уникальные торговые предложения, после чего страница выходит в свет. Разработка лендинга и запуск в сети — до 7 рабочих дней. Стоит отметить, что в разработку самой посадочной страницы входит и написание копирайтером продающих текстов для вашего бизнеса, чтобы каждый посетитель страницы захотел совершить покупку именно у вас. Результат: качественно разработаная продающая посадочная страница, которая готова приносить вам новых клиентов.