Макрос

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск

Макрос (от англ. macros, мн.ч. от macro) — программный объект, при обработке «развёртывающийся» в последовательность действий или команд.

Содержание

Макросы в прикладных программах

Во многих «офисных» продуктах (Microsoft Office и др.), в графических программах (например, CorelDRAW) при обработке макроса автоматически выполняется заданная для каждого макроса последовательность действий — нажатия на клавиши, выбор пунктов меню и т. д. Предоставляется интерфейс для записи новых и перезаписи существующих макросов.

Корректный перевод термина с английского — «макрокоманда», слово же «макрос» получило распространение благодаря использованию в локализованных продуктах американской корпорации Microsoft.

К лучшим из существующих на сегодняший день универсальным программам для создания макросов и автоматизации работы можно отнести линейки "Comfort Keys", "Robotask" и "Hot Keyboard". Каждая из данных программ обладает собственными преимуществами перед остальными. Говоря о специализированных программах данного направления, следует упомянуть об "AutoHook" для упрощения работы в "AutoCAD", причём наиболее функциональной является версия программы для "AutoCAD 2006", а не для более поздних версий (что проверено для версий "2007" и "2008", работающих с "AutoCAD"'ом соответствующих годов выпуска).

Макросы в программировании

В языке ассемблера, а также в некоторых других языках программирования, макрос — символьное имя, заменяемое при обработке препроцессором на последовательность программных инструкций.

Для каждого компилятора (ассемблера) существует специальный синтаксис объявления и вызова макросов. Макрос может «разворачиваться» в различные последовательности инструкций при каждом вызове — в зависимости от сработавших разветвлений внутри макроса и переданных ему аргументов.

Макросы в Лиспе

Часто бывает полезно не выписывать вычисляемое выражение вручную, а сформировать его с помощью программы. Эта идея автоматического динамического программирования особенно хорошо реализуется в Лиспе, поскольку программа в этом языке также представляется в виде списка. Управлять тем, что надо вычислить, а что оставить без изменения можно с помощью использования EVAL и QUOTE соответственно. Однако наиболее естественно программное формирование выражений осуществляется с помощью специального механизма - макросов (macro). Внешне макросы определяются и используются так же, как функции, отличается лишь способ их вычисления. Макросы дают возможность расширять синтаксис и семантику Лиспа и использовать новые подходящие для решаемой задачи формы предложений.

Абстракции такого характера называют абстракциями проблемной области (domain abstraction), а определяемое ими расширение языка Лисп - встроенным языком (embedded language). Однако с их использованием тоже связаны свои трудности и опасности - создаваемые в процессе вычислений формы часто трудно увидеть непосредственно из определения макроса или из формы его вызова. Синтаксис определения макроса выглядит так же, как синтаксис используемой при определении функций формы DEFUN:

(DEFMACRO имя список_формальных_параметров тело).

Вызов макроса совпадает по форме с вызовом функции, но его вычисление отличается от вычисления вызова функции. Первое отличие состоит в том, что в макросе не вычисляются аргументы - тело макроса вычисляется с аргументами в том виде, как они записаны. Второе отличие связано со способом вычисления тела макроса - вычисление вызова макроса состоит из двух последовательных этапов. На первом этапе осуществляется вычисление тела определения с аргументами из вызова таким же образом, как и для функции. Этот этап называют этапом расширения (expansion) или раскрытия макроса, поскольку возникающая форма, как правило, больше и сложнее исходной формы вызова. Часто говорят и о трансляции (translation) макросов, поскольку на этапе расширения макровызов транслируется в некоторое вычислимое лисповское выражение. На втором этапе вычисляется полученная из вызова раскрытая форма, значение которой возвращается в качестве значения всего макровызова. Существенно отметить, что если во время расширения макровызова доступны контекстные связи из определения, то вычисление раскрытой формы производится вне контекста макровызова. Приведем пример макроса, определяющего SETQQ, который действует наподобие SETQ, но блокирует вычисление и второго своего аргумента:

_(deficacro setqq (х у)
(list 'setq х (list (quote у))) 
SETQQ
_(setqq список (a b с)) ; 
(ABC)       
_список
(А В С).

Поясним выполняемые действия. После этапа расширения макровызова значением тела макроса было: (SETQ СПИСОК (QUOTE (А В С))). На втором этапе эта программно созданная форма вычисляется обычным образом и ее значение возвращается в качестве значения вызова макроса. В данном случае у возникшей формы есть побочный эффект. Итак, макрос - это форма, которая во время вычисления заменяется на новую, обычно более сложную форму, которая затем вычисляется, но вычисления на втором этапе производится вне контекста макровызова, и поэтому статические связи из макроса не действуют В заключение следует отметить, что написание макросов (как любых функций из области метапрограммирования) является существенно более сложной задачей, чем определение обычных функций, поскольку нужно точно представлять, что вычисляется на этапе расширения, а что на втором этапе. Для облегчения написания макросов в Лиспе используются специальные средства. Одно из них называется обратной блокировкой, которая, как обычная блокировка прекращает оценивание (она обозначается обратным апострофом «’»). Другое - применяется внутри обратно блокированного выражения, локально отменяя действие обратной блокировки (обозначается запятой «,» перед каждым, предназначенным для вычисления подвыражением). В заключение приведем без комментариев пример на определение новых синтаксических форм из Хьювенен Э., Сеппанен Й. Мир Лиспа., т.1, которые с помощью макросов транслируются в известные интерпретатору или ранее определенные формы. Пусть мы хотим использовать для представления условного выражения предложение на русском языке (ЕСЛИ условие ТО р ИНАЧЕ q). Его можно было бы определить следующим образом:

(defmacro если (условие  то р иначе q) ‘(if ,условие ,р  ,q))
_(setq х '(alea iacta est)) 
(ALEA IACTA EST)
_(если (atom x) то 'орел иначе 'решка)
РЕШКА.

См. также

Ссылки


Личные инструменты

Served in 0.115 secs.