В чем смысл макро программирования?
Макросы позволяют приспособить лисп язык под решаемую задачу. С помощью них Вы можете добавить в язык конструкции которых вам не хватает. Бесспорно, можно все задачи решить и без макросов. К примеру clojure имеет макрос with-open, который аналогичен конструкции try-with-resources языка Java версии 7. Java программисты обходились без этой конструкции и могут и дальше ее не использовать, но с ней вы пишете меньше кода и делаете код более надежным. Программисты использующие java версии ниже 7 не могут создать такую синтаксическую конструкцию самостоятельно и пользуются веткой finaly конструкции try...catch. Чтобы такая конструкция появилась в языке понадобилось доработать компилятор. Программисты лисп языков с помощью макросов могут добавить в язык любую синтаксическую конструкцию, которой им не хватает, без изменения компилятора. К примеру clojure версии 1.6 использует JDK 1.5 в котором нет конструкции try-with-resources но с помощью макроса with-open вы уже можете пользоваться таким же функционалом. Другой пример - макрос loop языка Common Lisp по сути определяет свой собственный встроенный микро язык для реализации всевозможных циклов.
Если вам кажется, что в языке чего-то не хватает, или что вы пишете много лишнего кода, то возможно вам стоит задуматься о макросах.
Чтобы программы могли "делать" те, кто в программировании ничего не понимает. Вы не думайте, не каждый мечтает научиться программировать. Некоторым вполне хватает и макросов.
Это у вас в голове функционал программы отделён от интерфейса. У других это монолит. )))