Система переписывания исходного кода Lisp

rocky спросил: 13 октября 2017 в 07:32 в: macros

Я хотел бы взять код Emacs Lisp, который был развернут макросом, и unmacro развернуть его. Я спрашивал об этом на форуме Emacs безуспешно. См .: https://emacs.stackexchange.com/questions/35913/program-rewriting-systems-unexpanded-a-defmacro-given-a-list-of-macros-to-undo

Однако, один Я бы подумал, что такого рода вещи, трансформация S-выражений, прямо в аллее Лиспа. И defmacro, я полагаю, доступен в Лиспе, как и в Emacs Lisp.

Так что, безусловно, существуют системы преобразования программ или системы переписывания терминов, которые можно адаптировать здесь.

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

Сводка результатов, так что далеко: Хотя было несколько ответов, в которых рассматриваются интересные возможности, сейчас нет ничего определенного. Поэтому я думаю, что лучше оставить это открытым. Я обобщу некоторые из предложений. (Я проголосовал за все ответы, которые на самом деле были ответами, а не комментировал сложность.)

Во-первых, многие люди предлагают рассмотреть особую форму макросов, которые выполняют только расширение, или, как выразился Дрю:

макро-расширение (т.е. не расширение, за которым следует оценка Lisp). Макро-расширение - это еще один способ сказать семантику редукции, или переписывание.

Текущий Фронтнер, на мой взгляд, находится в посте phils, где он использует средство сопоставления с образцом, которое кажется специфичным для Emacs: pcase. Я буду исследовать это и опубликую результаты моих выводов. Если у кого-то еще есть мысли по этому поводу, пожалуйста, присоединяйтесь.

Дрю написал программу под названием FTOC, целью которой было преобразовать Франц Лисп в Common Lisp; googling включает сообщение comp.lang.lisp

Я нашел пакет Common Lisp под названием optima с тарифом-квазиквотой. Однако Пауло считает, что это может быть недостаточно мощно, так как он не обрабатывает возврат из коробки, а может быть запрограммирован вручную. Несмотря на то, что общий возврат может быть хорошим, я не уверен, что мне это нужно для наиболее часто используемых ситуаций.)

Примечание: Некоторые из них отстают от конкретного приложения. вызывая мой начальный интерес. (Но обратите внимание, что в исследованиях нередки случаи, когда хорошие решения применяются не так, как первоначально предполагалось.)

Итак, вот несколько советов по изменению конечного приложения. Хорошее решение для них, вероятно, приведет к решению для Emacs Lisp. (И если, если это поможет вам притвориться, что я не заинтересован в Emacs Lisp, это нормально для меня). Предположим, что вместо декомпилятора для Emacs Lisp я хочу написать декомпилятор для clojure или какой-нибудь системы Common Lisp. Или, как следует из ответа Сильвестра, предположим, что я хотел бы автоматически реорганизовать свой код, принимая во внимание преимущество использования более лаконичных макросов, которые существуют или которые были улучшены. Напомним, что когда-то в Emacs Lisp не было макросов "когда" или "если только".


0 ответов