Как узнать, представляет ли символ функцию или макрос?


Я пишу макрос для композиции функции / макроса (возможны смешанные комбинации). Внутри макроса я должен обращаться с символами, которые представляют функции и те, которые называют макросы по-разному. Это связано с тем, что функция результата должна работать с любым количеством аргументов (если "самая низкая" функция в композиции может), и я не могу применить apply к макросам. Мой вопрос: Как определить, что представляет данный символ: функцию или макрос?

1 2

1 ответ:

Макрос:

CL-USER 8 > (macro-function 'bar)
NIL

CL-USER 9 > (macro-function 'lambda)
#<Function LAMBDA 41100B7E94>

Функция:

CL-USER 15 > (and (fboundp '+)
                  (not (macro-function '+))
                  (not (special-operator-p '+)))
T