Самая распространенная проблема при написании макросов заключается в том, что часть реальной работы выполняется преждевременно — во время расширения макроса, а не в самом расширении. Например, в одном реальном пакете было такое определение макроса:
(defmacro my-set-buffer-multibyte (arg)
(if (fboundp 'set-buffer-multibyte)
(set-buffer-multibyte arg)))
С этим ошибочным определением макроса программа работала нормально при
интерпретации, но завершалась с ошибкой при компиляции. Это определение
макроса вызывало set-buffer-multibyte во время компиляции,
что было неправильно, а затем ничего не делало, когда скомпилированный пакет
запускался. Определение, которое программист действительно хотел, было таким:
(defmacro my-set-buffer-multibyte (arg)
(if (fboundp 'set-buffer-multibyte)
`(set-buffer-multibyte ,arg)))
Этот макрос расширяется, если это уместно, в вызов
set-buffer-multibyte, который будет выполнен, когда
скомпилированная программа будет фактически запущена.