Когда я пытался «применить» макрос к списку аргументов, я получил ошибку о том, что функция не связана, что означает, что «apply» получает только функцию, а не макрос, в качестве первого аргумента.
Чтобы это исправить, я написал новую функцию apply-macro следующим образом:
(defun apply-macro (macro arg-list)
(eval
`(,macro ,@(loop for arg in arg-list
collect `(quote ,arg)))))
Например, я написал макрос для объединения нескольких списков вместе:
(defmacro conc-lists (&rest lists)
`(funcall #'concatenate 'list ,@lists))
например (conc-lists '(ab)' (cd) '(ef)) ;; => (ABCDEF)
Теперь попробуйте' apply-macro ':
(apply-macro 'conc-lists '((a b) (c d) (e f)))
Он работает и возвращает тот же вывод.
Фактически он будет расширен до:
(eval
(conc-lists (quote (a b)) (quote (c d)) (quote (e f))))
Вы также можете передать форму макросу:
(apply-macro 'conc-lists (maplist #'list '(a b c)))
;;=> ((A B C) (B C) (C))
Вернитесь к своему вопросу, он решен:
(apply-macro 'or '(nil 0 nil)) ;;=> 0