Нет смысла писать рекурсивные функции, такие как SUM или QUICKSORT, в качестве макросов. Кроме того, нет, в целом это невозможно. Макрос расширяет исходный код. Во время компиляции макрос видит только исходный код, но не реальные аргументы, с которыми вызывается код. После компиляции макрос исчезает и заменяется кодом, который он производит. Этот код затем вызывается с аргументами. Поэтому макрос не может выполнять вычисления во время компиляции, основываясь на значениях аргументов, которые известны только во время выполнения.
Исключение составляют: когда значение аргумента известно во время компиляции / расширения макроса, тогда макрос может расширяться до рекурсивного вызова макроса. Но это действительно продвинутое использование макросов и ничего, что можно было бы добавить в код, поддерживаемый другими программистами.
Практическое правило. Если вы хотите выполнять рекурсивные вычисления, используйте функции. Если вы хотите обработать исходный код, используйте макрос.
Также попробуйте использовать форматирование, подобное Лиспу. Редактор считает скобки, делает подсветку и отступ. Не ставьте скобки в свои строки, они чувствуют себя одинокими. Обычный стиль Lisp более компактен и больше использует горизонтальное пространство. Если вы работаете со списками, используйте FIRST и REST вместо CAR и CDR.
Ваша функция 'suma' будет выглядеть так:
(defun suma (list)
(if (rest list)
(+ (suma (rest list))
(first list))
(first list)))
Забудьте о макросе. Но, если вы хотите узнать больше о макросах, то книга Пола Грэма « On Lisp » (доступна для скачивания) является хорошим источником знаний.