Next: , Previous: Docs and Compilation, Up: Byte Compilation


15.4 個別関数の動的ロード

ファイルをコンパイルするとき、 動的関数ロード(dynamic function loading、 遅延ロード(lazy loading)ともいう)機能を指定できます。 動的関数ロードでは、ロードするときにファイル内の関数定義をすべて 読むわけではありません。 そのかわりに、各関数定義には、 そのファイルを指す埋め草が入っています。 それぞれの関数を初めて呼び出したときに、 その完全な定義をファイルから読み取り、埋め草を置き換えます。

動的関数ロードの利点は、ファイルをロードするよりかなり速いことです。 ユーザーが呼び出せる数多くの別々の関数を収めたファイルにおいては、 それらの1つだけを使って残りのものを使わないのであれば、 これは有利なことです。 キーボードコマンドを提供する特別なモードには、 しばしばこのような使い方のパターンがあります。 ユーザーがモードを起動しても、提供するコマンドの一部しか使わないのです。

動的関数ロードの機能には、ある種の欠点もあります。

Emacsのファイル群をインストールした普通の状況では、 このような問題は起きないはずです。 しかし、Lispファイルを読者が変更すると起こりえます。 これらの問題を回避するもっとも簡単な方法は、 再コンパイルするたびに新たにコンパイルしたファイルを ただちに再ロードすることです。

バイトコンパイラは、コンパイル時に変数byte-compile-dynamicnil以外であれば、動的関数ロードの機能を使います。 動的ロードは特定のファイルで必要なだけですから、 この変数をグローバルに設定しないでください。 そのかわりにファイルにローカルな変数束縛を使って 特定のソースファイルだけでこの機能をオンにします。 たとえば、ソースファイルの先頭行につぎのテキストを書けば、 そのようにできます。

     -*-byte-compile-dynamic: t;-*-
— Variable: byte-compile-dynamic

これがnil以外であると、 バイトコンパイラは、動的関数ロードを使うように設定した コンパイル済みのファイルを生成する。

— Function: fetch-bytecode function

functionを完全にロードしていないと、 バイトコンパイルしたファイルからただちにfunctionの定義をロードする。 引数functionは、バイトコード関数オブジェクトか関数名である。