← Все новости

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

Как хорошо известно, макро в Лиспе – это особая функция, которая вычисляется в два этапа: на первом этапе происходит генерация некоей промежуточной формы, а на втором этапе эта форма выполняется в текущем контексте. Важно отметить, что на первом этапе ядро Лиспа не вычисляет значения аргументов вызова.Использование макро в гомоиконном Лиспе позволяет добавлять в Лисп новые “операторы” (именно поэтому знаменитый лиспер Пол Грэм назвал Лисп программируемым языком программирования).Однако, у медали имеется и обратная сторона: если код содержит большое количество макро, то при интерпретации Лиспа будет тратиться значительное время на макрогенерацию. Цель этой небольшой заметки состоит в том, чтобы указать вполне очевидный способ снизить отмеченный недостаток использования макро. Этот способ состоит в том, что весь исполняемый код предварительно обрабатывается, в нём отыскиваются макровызовы и “раскрываются” (заменяются на результат макрогенерации).Поскольку большая часть Лисп-кода содержится в функциях, то достаточно разработать функцию, которая будет получать на вход имя обрабатываемой функции. Обработка будет состоять в том, что каждый макровызов будет заменяться результатом его раскрытия.Выкладки мы будем выполнять в HomeLisp. Перечислим основные средства, которыми мы будем пользоваться:- мacroexpand (функция, которая строит макрорасширение);- proplist (получение списка свойств символа для того, чтобы отличить макровызов от вызова функции);- stat (функция, которая включает режим статистики); Читать далее