GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Compiling-Macros.html ・ emacs-doc.conao3.com

14.3 マクロとバイトコンパイル

なぜわざわざマクロの展開式を計算し、さらにその展開式を評価するのか、という疑問を持つかもしれません。マクロ本体に直接、目的の結果を生成させればよいのではないでしょうか。その理由は、コンパイルにあります。

コンパイル対象のLispプログラムにマクロ呼び出しが現れると、Lispコンパイラはインタプリタと同様にマクロ定義を呼び出し、展開結果を受け取ります。しかし、この展開結果を評価するのではなく、あたかもプログラムに直接記述されていたかのようにその展開結果をコンパイルします。その結果、コンパイル後のコードはマクロで意図された値と副作用を生成しつつ、コンパイル時のフルスピードで実行されます。もしマクロ本体が自ら値と副作用を計算していたとしたら、この仕組みは機能しません。それらはコンパイル時に計算されることになり、有用ではないからです。

マクロ呼び出しのコンパイルを機能させるには、呼び出しがコンパイルされる時点で、マクロがすでにLispで定義されている必要があります。コンパイラには、これを実現するための特別な機能が備わっています。コンパイル対象のファイルにdefmacro形式が含まれている場合、そのファイルの残りのコンパイル処理の間、マクロは一時的に定義されます。

ファイルをバイトコンパイルすると、ファイル内のトップレベルにある require 呼び出しも実行されるため、必要なマクロ定義を記述したファイルを必須とすることで、コンパイル時に必要なマクロ定義が利用可能であることを保証できます(機能を参照)。コンパイル済みプログラムを誰かが 実行 する際にマクロ定義ファイルを読み込まないようにするには、require 呼び出しを eval-when-compile で囲んでください(コンパイル時の評価を参照)。