Неправильное время
Наиболее распространённая проблема при написании макросов заключается в выполнении части реальной работы преждевременно — во время развёртывания макроса, а не в самом развёртывании. Например, в одном реальном пакете была такая макроопределения:
(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, который будет выполнен, когда скомпилированная программа будет фактически запущена.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Wrong-Time.html