14.5.1 Неправильное время

Самая распространенная проблема при написании макросов заключается в том, что часть реальной работы выполняется преждевременно — во время расширения макроса, а не в самом расширении. Например, в одном реальном пакете было такое определение макроса:

(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, который будет выполнен, когда скомпилированная программа будет фактически запущена.