Я не думаю, что есть принципиальная разница в макросах "стиль C" и "стиль Lisp" в том, как они компилируются.Оба преобразуют исходный код до того, как его увидит собственно компилятор.Большая разница в том, что макросы C используют препроцессор C (более слабый вторичный язык, который в основном предназначен для простой подстановки строк), а макросы Lisp написаны на самом Lisp (и, следовательно, могут делать все что угодно).
(какв сторону: я не видел нескомпилированный Лисп некоторое время ... конечно, не с начала века. Но если что-то интерпретировать, то кажется, что проблема отладки макросов легче, а не сложнее, так как у вас естьбольше информации.)
Я согласен с Майклом: я не видел отладчика для C, который вообще обрабатывает макросы.Код, использующий макросы, преобразуется до того, как что-то случится.Режим «отладка» для компиляции кода C обычно означает, что он хранит функции, типы, переменные, имена файлов и тому подобное - я не думаю, что кто-либо из них хранит информацию о макросах.
Для программ отладки, которые используют макросы , Lisp во многом похож на C: ваш отладчик видит скомпилированный код, а не приложение макроса.Обычно макросы сохраняются простыми и отлаживаются независимо перед использованием, чтобы избежать необходимости, как C.
Для отладки самих макросов перед тем, как вы приступитеи использовать его где-нибудь, Lisp имеет функции, которые делают это проще, чем в C, например, repl и macroexpand-1
(хотя в C, очевидно, есть способ макрорасширить весь файл полностью, сразу).Вы можете увидеть до и после макроразложения, прямо в вашем редакторе, когда вы пишете его.
Я не могу вспомнить ни разу, когда сталкивался с ситуацией, когда отладка в само определение макроса было бы полезно.Либо это ошибка в определении макроса, в этом случае macroexpand-1
немедленно изолирует проблему, либо ошибка ниже этого, и в этом случае обычные средства отладки работают нормально, и мне все равно, что макроразложение произошло между двумя кадрамимой стек вызовов.