23-04-2023
Мáкрос (от англ. macros, мн.ч. от macro) — программный объект, при обработке «развёртывающийся» в последовательность действий или команд.
Содержание |
Во многих «офисных» продуктах (OpenOffice.org, Microsoft Office и др.), в графических программах (например, CorelDRAW) при обработке макроса автоматически выполняется заданная для каждого макроса последовательность действий — нажатия на клавиши, выбор пунктов меню и т. д. Предоставляется интерфейс для записи новых и перезаписи существующих макросов.
Используя макросы, можно значительно (в десятки, а то и сотни раз) увеличить эффективность работы с приложением. Помимо выполнения набора встроенных в приложение команд, макрос позволяет производить обработку внешних файлов, загрузку и передачу файлов и данных через интернет, чтение и изменение настроек операционной системы. В большинстве случаев макрорекордер (режим записи действий пользователя в виде макроса) выдаёт код, нуждающийся в доработке. Но, тем не менее, и такой макрос значительно сокращает время, требующееся на выполнение рутинных операций.
Корректный перевод термина с английского — «макрокоманда», слово же «макрос» получило распространение благодаря использованию в локализованных продуктах американской корпорации Microsoft.
К лучшим из существующих на сегодняшний день универсальным программам для создания макросов и автоматизации работы можно отнести линейки "Comfort Keys", "Robotask" и "Hot Keyboard".уточнить] Говоря о специализированных программах данного направления, следует упомянуть об "AutoHook" для упрощения работы в "AutoCAD", причём наиболее функциональной является версия программы для "AutoCAD 2006", а не для более поздних версий (что проверено для версий "2007" и "2008", работающих с "AutoCAD"'ом соответствующих годов выпуска).
Каждая из данных программ обладает собственными преимуществами перед остальными.[В языке ассемблер, а также в некоторых других языках программирования, макрос — символьное имя, заменяемое при обработке препроцессором на последовательность программных инструкций.
Для каждого компилятора (ассемблера) существует специальный синтаксис объявления и вызова макросов. Макрос может «разворачиваться» в различные последовательности инструкций при каждом вызове — в зависимости от сработавших разветвлений внутри макроса и переданных ему аргументов.
Часто бывает полезно не выписывать вычисляемое выражение вручную, а сформировать его с помощью программы. Эта идея автоматического динамического программирования особенно хорошо реализуется в Лиспе, поскольку программа в этом языке также представляется в виде списка. Управлять тем, что надо вычислить, а что оставить, без изменения, можно с помощью использования EVAL
и QUOTE
, соответственно.[1] Однако, наиболее естественно программное формирование выражений осуществляется с помощью специального механизма — макросов (macro). Внешне макросы определяются и используются так же, как функции, отличается лишь способ их вычисления. Макросы дают возможность расширять синтаксис и семантику Лиспа и использовать новые подходящие для решаемой задачи формы предложений.
Абстракции такого характера называют абстракциями проблемной области (domain abstraction), а определяемое ими расширение языка Лисп — встроенным языком (embedded language). Однако с их использованием тоже связаны свои трудности и опасности - создаваемые в процессе вычислений формы часто трудно увидеть непосредственно из определения макроса или из формы его вызова. Синтаксис определения макроса выглядит так же, как синтаксис используемой при определении функций формы DEFUN:
(DEFMACRO имя список_формальных_параметров тело).
Вызов макроса совпадает по форме с вызовом функции, но его вычисление отличается от вычисления вызова функции:
Приведем пример макроса, определяющего 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) то 'орел иначе 'решка) РЕШКА.
Это заготовка статьи о компьютерных языках. Вы можете помочь проекту, исправив и дополнив её. |
Макрос.