Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика реферат

.docx
Скачиваний:
5
Добавлен:
13.04.2021
Размер:
19.75 Кб
Скачать

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

Во многих «офисных» продуктах (OpenOffice.org, 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, но блокирует вычисление и второго своего аргумента:

_(defmacro setqq (х у)

(list 'setq х (list (quote у)))

SETQQ

_(setqq список (a b с)) ;

(ABC)

_список

(А В С).

Поясним выполняемые действия. После этапа расширения макровызова значением тела макроса было:

(SETQ СПИСОК (QUOTE (А В С)))

На втором этапе эта программно созданная форма вычисляется обычным образом и её значение возвращается в качестве значения вызова макроса. В данном случае у возникшей формы есть побочный эффект.

Итак, макрос — это форма, которая во время вычисления заменяется на новую, обычно более сложную форму, которая затем вычисляется, но вычисления на втором этапе производится вне контекста макровызова, и поэтому статические связи из макроса не действуют.

В заключение следует отметить, что написание макросов (как и любых функций из области метапрограммирования) является существенно более сложной задачей, чем определение обычных функций, поскольку нужно точно представлять, что вычисляется на этапе расширения, а что на втором этапе. Для облегчения написания макросов в языке Лисп используются специальные средства:

  • одно из них называется обратной блокировкой, которая, как обычная блокировка прекращает оценивание (она обозначается обратным апострофом «’»);

  • другое — применяется внутри обратно блокированного выражения, локально отменяя действие обратной блокировки (обозначается запятой «,» перед каждым, предназначенным для вычисления подвыражением).

В заключение приведем без комментариев пример на определение новых синтаксических форм, которые с помощью макросов транслируются в известные интерпретатору или ранее определённые формы. Пусть, мы хотим использовать для представления условного выражения предложение на русском языке:

(ЕСЛИ условие ТО р ИНАЧЕ q).

Его можно было бы определить следующим образом:

(defmacro если (условие то р иначе q) ‘(if ,условие ,р ,q))

_(setq х '(alea iacta est))

(ALEA IACTA EST)

_(если (atom x) то 'орел иначе 'решка)

РЕШКА.

Соседние файлы в предмете Информатика