Next: Related Topics, Previous: Function Cells, Up: Functions
defun
のかわりにdefsubst
を使うことで、
インライン関数(inline function)を定義できます。
インライン関数は、1つの点を除いて、普通の関数と同様に動作します。
そのような関数の呼び出しをコンパイルすると、
関数定義は呼び出し側で展開されます。
関数を展開すると明示的な呼び出しが高速になります。 しかし、それには欠点もあります。 その1つは、柔軟性を減らすことです。 関数の定義を変更しても、コンパイルし直すまでは、 すでに展開された呼び出しは古い定義を使い続けます。 関数を再定義できる柔軟性はEmacsでは重要な機能ですから、 速度が本当に重要でなければ、関数を展開すべきではありません。
別の欠点は、大きな関数を展開すると、コンパイルした関数のサイズが ファイル内でもメモリ上でも増加します。 インライン関数のスピードの利点は、小さな関数でもっとも大きいので、 一般には大きな関数を展開すべきではありません。
インライン関数が実行するのと同じコードに展開するようにマクロを定義する
ことも可能です。
(see Macros。)
しかし、マクロは式で直接使った場合に制限されます。
マクロは、apply
やmapcar
などで呼び出せません。
さらに、普通の関数をマクロに変換するには、多少の作業が必要です。
普通の関数をインライン関数に変換するのはとても簡単です。
単に、defun
をdefsubst
で置き換えるだけです。
インライン関数の各引数は、ちょうど1回だけ評価されるので、
マクロのように本体で引数を何回使うかを考慮する必要はありません。
(see Argument Evaluation。)
インライン関数は、マクロと同様に、 同じファイル内の定義位置よりうしろで使われ展開されます。