Next: , Previous: Named Features, Up: Loading


14.7 アンロード

ライブラリでロードした関数や変数を捨てさって 他のLispオブジェクト向けにメモリを回収することができます。 そうするには関数unload-featureを使います。

— コマンド: unload-feature feature &optional force

このコマンドは、featureを提供するライブラリをアンロードする。 つまり、当該ライブラリにおいて、defundefaliasdefsubstdefmacrodefconstdefvardefcustomで定義した関数、マクロ、変数すべてを未定義にする。 そうして、これらのシンボルに以前設定してあった自動ロードの設定を復元する。 (ロード時に、これらをシンボルの属性autoloadに保存している。)

以前の定義に復元するまえに、unload-featureremove-hookを 実行して、ライブラリ内の関数を特定のフックから取り除く。 これらのフックは、‘-hook’や‘-hooks’で終る名前の変数、および、 loadhist-special-hooksに入っているものである。 これは、重要なフックにおいて存在しない関数を参照することで Emacsが動作不能になるのを防ぐ。

これらの処置でも誤動作防止には不十分であるときには、 ライブラリで明示的なアンロードフックを定義できる。 feature-unload-hookを定義してあると、 以前の定義を復元するまえに、 フックを削除する通常の動作のかわりに このフックをノーマルフックとして実行する。 アンロードフックでは、 ライブラリをいったんアンロードすると動作不能になるような ライブラリで変更したグローバルな状態をすべてアンドゥすべきである。

通常、unload-featureは、他のライブラリが依存している ライブラリのアンロードは拒否する。 (ライブラリabrequire(要求)していると、 ライブラリaはライブラリbに依存している。) 省略可能な引数forcenil以外であると、 依存関係を無視し、任意のライブラリをアンロードできる。

関数unload-featureはLispで書いてあり、 その動作はload-historyに基づきます。

— Variable: load-history

この変数の値は、ライブラリ名をそのライブラリが定義する関数や変数の名前、 そのライブラリが提供する機能、そのライブラリが要求する機能に対応付ける 連想リストである。

各要素はリストであり、1つ1つが1つのライブラリを記述する。 リストのcarは文字列であり、ライブラリ名である。 リストの残りは、以下の種類のオブジェクトから成る。

load-historyの値には、carnilであるような 1つの要素があってもよい。 この要素は、ファイルを訪問してないバッファ内でeval-bufferによって 作られた定義であることを示す。

コマンドeval-regionload-historyを更新しますが、 訪問先ファイルに対応する要素に、定義されるシンボルを追加するのであって、 要素を置き換えるのではありません。

あらかじめロード済みのライブラリは、load-historyに寄与しません。

— Variable: loadhist-special-hooks

この変数は、ライブラリ内で定義された関数を削除するために ライブラリをアンロードするまえに走査するフックのリストを保持する。