マクロを記述する際に最もよくある問題は、本来の処理を早すぎる段階で行ってしまうこと――つまり、マクロの展開自体ではなく、展開の過程で処理を行ってしまうことです。例えば、ある実際のパッケージには次のようなマクロ定義がありました:
(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
の呼び出しに展開され、コンパイル済みプログラムが実際に実行される際に呼び出されます。