- Макрокоманда
-
Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей.Для термина «Макрос» см. другие значения.Макрокоманда или макрос (от греч. μακρός - большой, долгий;) — программный объект, который во время вычисления заменяется на новый объект, создаваемый определением макроса на основе его аргументов, затем выражается обычным образом.
Содержание
Макросы в прикладных программах
Во многих «офисных» продуктах (OpenOffice.org, Microsoft Office и др.), в графических программах (например, CorelDRAW) при обработке макроса автоматически выполняется заданная для каждого макроса последовательность действий — нажатия на клавиши, выбор пунктов меню и т. д. Предоставляется интерфейс для записи новых и перезаписи существующих макросов.
Используя макросы, можно значительно (в десятки, а то и в сотни раз) увеличить эффективность работы с приложением. Помимо выполнения набора встроенных в приложение команд, макрос позволяет производить обработку внешних файлов, загрузку и передачу файлов и данных через интернет, чтение и изменение настроек операционной системы. В большинстве случаев макрорекордер (режим записи действий пользователя в виде макроса) выдаёт код, нуждающийся в доработке. Но, тем не менее, и такой макрос значительно сокращает время, требующееся на выполнение рутинных операций.
Корректный перевод термина с английского — «макрокоманда», слово же «макрос» получило распространение благодаря использованию в локализованных продуктах американской корпорации Microsoft.
К лучшим из существующих на сегодняшний день универсальным программам для создания макросов и автоматизации работы можно отнести линейки "Comfort Keys", "Robotask" и "Hot Keyboard".AutoCAD", причём наиболее функциональной является версия программы для "AutoCAD 2006", а не для более поздних версий (что проверено для версий "2007" и "2008", работающих с "AutoCAD"ом соответствующих годов выпуска).
Каждая из данных программ обладает собственными преимуществами перед остальными.[уточнить] Говоря о специализированных программах данного направления, следует упомянуть об "AutoHook" для упрощения работы в "Макросы в программировании
В языках ассемблера, а также в некоторых других языках программирования, макрос — символьное имя, заменяемое при обработке препроцессором на последовательность программных инструкций.
Для каждого интерпретатора (языков ассемблера) существует специальный синтаксис объявления и вызова макросов. Макрос может «разворачиваться» в различные последовательности инструкций при каждом вызове, в зависимости от сработавших разветвлений внутри макроса и переданных ему аргументов.
Макросы в языке Лисп
Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей.Часто бывает полезно не прописывать вычисляемое выражение вручную, а сформировать его с помощью программы. Эта идея автоматического динамического программирования особенно хорошо реализуется в языке Лисп, поскольку программа в этом языке также представляется в виде списка. Управлять тем, что надо вычислить, а что оставить, без изменения, можно с помощью использования
EVAL
иQUOTE
, соответственно[1]. Однако, наиболее естественно программное формирование выражений осуществляется с помощью специального механизма — макросов (macro). Внешне макросы определяются и используются так же, как функции, отличается лишь способ их вычисления. Макросы дают возможность расширять синтаксис и семантику Лиспа и использовать новые подходящие для решаемой задачи формы предложений.Абстракции такого характера называют абстракциями проблемной области (domain abstraction), а определяемое ими расширение языка Лисп — встроенным языком (embedded language). Однако, с их использованием тоже связаны свои трудности и опасности — создаваемые в процессе вычислений формы часто трудно увидеть непосредственно из определения макроса или из формы его вызова. Синтаксис определения макроса выглядит так же, как синтаксис используемой при определении функций формы
DEFUN
:(DEFMACRO имя список_формальных_параметров тело)
.
Вызов макроса совпадает по форме с вызовом функции, но его вычисление отличается от вычисления вызова функции.
- Первое отличие состоит в том, что в макросе не вычисляются аргументы — тело макроса вычисляется с аргументами в том виде, как они записаны.
- Второе отличие связано со способом вычисления тела макроса — вычисление вызова макроса состоит из двух последовательных этапов.
- На первом этапе осуществляется вычисление тела определения с аргументами из вызова таким же образом, как и для функции. Этот этап называют этапом расширения (expansion) или раскрытия макроса, поскольку возникающая форма, как правило, больше и сложнее исходной формы вызова. Часто говорят и о трансляции (translation) макросов, поскольку на этапе расширения макровызов они транслируется в некоторое вычислимое выражение на языке Лисп.
- На втором этапе вычисляется полученная из вызова раскрытая форма, значение которой возвращается в качестве значения всего макровызова. Существенно отметить, что если во время расширения макровызова доступны контекстные связи из определения, то вычисление раскрытой формы производится вне контекста макровызова.
Приведем пример макроса, определяющего
SETQQ
, который действует наподобиеSETQ
, но блокирует вычисление и второго своего аргумента:_(defmacro setqq (х у) (list 'setq х (list (quote у))) SETQQ _(setqq список (a b с)) ; (ABC) _список (А В С).
Поясним выполняемые действия. После этапа расширения макровызова значением тела макроса было:
(SETQ СПИСОК (QUOTE (А В С)))
На втором этапе эта программно созданная форма вычисляется обычным образом и её значение возвращается в качестве значения вызова макроса. В данном случае у возникшей формы есть побочный эффект.
Итак, макрос — это форма, которая во время вычисления заменяется на новую, обычно более сложную форму, которая затем вычисляется, но вычисления на втором этапе производится вне контекста макровызова, и поэтому статические связи из макроса не действуют.
В заключение следует отметить, что написание макросов (как и любых функций из области метапрограммирования) является существенно более сложной задачей, чем определение обычных функций, поскольку нужно точно представлять, что вычисляется на этапе расширения, а что на втором этапе. Для облегчения написания макросов в языке Лисп используются специальные средства:
- одно из них называется обратной блокировкой, которая, как обычная блокировка прекращает оценивание (она обозначается обратным апострофом «’»);
- другое — применяется внутри обратно блокированного выражения, локально отменяя действие обратной блокировки (обозначается запятой «,» перед каждым, предназначенным для вычисления подвыражением).
В заключение приведем без комментариев пример на определение новых синтаксических форм[2], которые с помощью макросов транслируются в известные интерпретатору или ранее определённые формы. Пусть, мы хотим использовать для представления условного выражения предложение на русском языке[стиль!]:
(ЕСЛИ условие ТО р ИНАЧЕ q).
Его можно было бы определить следующим образом:
(defmacro если (условие то р иначе q) ‘(if ,условие ,р ,q)) _(setq х '(alea iacta est)) (ALEA IACTA EST) _(если (atom x) то 'орел иначе 'решка) РЕШКА.
См. также
Ссылки
Примечания
- ↑ Функции пользователя. Макросы в системе muLISP85
- ↑ Хьювенен Э., Сеппанен Й. Мир Лиспа., т.1
Искусственный интеллект Философия
Портал Направления Применение Исследователи Норберт Винер • Алан Тьюринг • В. М. Глушков • Г. С. Осипов • Д. Э. Попов • Д. А. Поспелов • М. Г. Гаазе-Рапопорт • Т. А. Гаврилова • В. Ф. Хорошевский • Г. С. Поспелов • Марвин Мински • Джон Маккарти • Фрэнк Розенблатт • Чарльз Бэббидж • Аллен Ньюэлл • Герберт Саймон • Ноам Хомский • Джуда Перл • Сеймур Паперт • Клод Шеннон • Джозеф Уайзенбаум • Патрик Винстон • В. К. Финн
Организации Категории:- Концепции языков программирования
- Искусственный интеллект
Wikimedia Foundation. 2010.