← Назад к новостям

Предварительная трансляция макро в HomeLisp

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

Важно отметить, что на первом этапе ядро Лиспа не вычисляет значения аргументов вызова.

Использование макро в гомоиконном Лиспе позволяет добавлять в Лисп новые “операторы” (именно поэтому знаменитый лиспер Пол Грэм назвал Лисп программируемым языком программирования).

Однако, у медали имеется и обратная сторона: если код содержит большое количество макро, то при интерпретации Лиспа будет тратиться значительное время на макрогенерацию.

Цель этой небольшой заметки состоит в том, чтобы указать вполне очевидный способ снизить отмеченный недостаток использования макро. Этот способ состоит в том, что весь исполняемый код предварительно обрабатывается, в нём отыскиваются макровызовы и “раскрываются” (заменяются на результат макрогенерации).

Поскольку большая часть Лисп-кода содержится в функциях, то достаточно разработать функцию, которая будет получать на вход имя обрабатываемой функции. Обработка будет состоять в том, что каждый макровызов будет заменяться результатом его раскрытия.

Выкладки мы будем выполнять в HomeLisp. Перечислим основные средства, которыми мы будем пользоваться:

- мacroexpand (функция, которая строит макрорасширение);

- proplist (получение списка свойств символа для того, чтобы отличить макровызов от вызова функции);

- stat (функция, которая включает режим статистики);

Читать далее
📊 Источник: Habr | Оригинал