Next: Declare Form, Previous: Obsolete Functions, Up: Functions [Contents][Index]
インライン関数(inline
function)は関数と同様に機能しますが、1つ例外があります。その関数の呼び出しがバイトコンパイルされると(Byte Compilationを参照)、その関数の定義が呼び出し側に展開されます。インライン関数を定義するには、defun
のかわりにdefsubst
を使用します。
このマクロはインライン関数を定義する。マクロの構文はdefun
とまったく同じ(Defining Functionsを参照)。
関数をインラインにすることにより、その関数の呼び出しが高速になる場合があります、が欠点もありその1つは柔軟性の減少です。その関数の定義を変更すると、すでにインライン化された呼び出しは、リコンパイルを行うまで古い定義を使用することになります。
もう1つの欠点は、大きな関数をインライン化することにより、コンパイルされたコードのファイル上およびメモリー上のサイズが増大することです。スピード面でのインライン化の有利性は小さい関数で顕著なので、一般的に大きな関数をインライン化するべきではありません。
インライン関数はデバッグ、トレース、アドバイス(Advising Functionsを参照)に際してうまく機能しません。デバッグの容易さと関数の再定義の柔軟さはEmacsの重要な機能なので、スピードがとても重要であってdefun
の使用が実際に性能の面で問題となるのか検証するためにすでにコードをチューニングしたのでなければ、たとえその関数が小さくてもインライン化するべきではありません。
インライン関数を定義した後そのインライン展開はマクロ同様、同じファイル内の後の部分で処理されます。
defsubst
を使用してインライン関数が実行するのと同じコードに展開されるマクロ(Macrosを参照)を定義することは可能です。しかし式内でのマクロの直接の使用には制限があります
—
apply
、mapcar
などでマクロを呼び出すことはできません。通常の関数からマクロへの変換には、そのための余分な作業が必要になります。通常の関数をインライン関数に変換するのは簡単です。defun
をdefsubst
に置き換えるだけです。インライン関数の引数はそれぞれ正確に1回評価されるので、マクロのときのようにbodyで引数を何回使用するか心配する必要はありません。
defsubst
の代替えとして、完全なコンパイラーマクロを通じて関数を定義するdefine-inline
を使用できます、define-inlineを参照してください。