ライブラリでロードした関数や変数を捨てさって
他のLispオブジェクト向けにメモリを回収することができます。
そうするには関数unload-feature
を使います。
このコマンドは、featureを提供するライブラリをアンロードする。 つまり、当該ライブラリにおいて、
defun
、defalias
、defsubst
、defmacro
、defconst
、defvar
、defcustom
で定義した関数、マクロ、変数すべてを未定義にする。 そうして、これらのシンボルに以前設定してあった自動ロードの設定を復元する。 (ロード時に、これらをシンボルの属性autoload
に保存している。)以前の定義に復元するまえに、
unload-feature
はremove-hook
を 実行して、ライブラリ内の関数を特定のフックから取り除く。 これらのフックは、‘-hook’や‘-hooks’で終る名前の変数、および、loadhist-special-hooks
に入っているものである。 これは、重要なフックにおいて存在しない関数を参照することで Emacsが動作不能になるのを防ぐ。これらの処置でも誤動作防止には不十分であるときには、 ライブラリで明示的なアンロードフックを定義できる。 feature
-unload-hook
を定義してあると、 以前の定義を復元するまえに、 フックを削除する通常の動作のかわりに このフックをノーマルフックとして実行する。 アンロードフックでは、 ライブラリをいったんアンロードすると動作不能になるような ライブラリで変更したグローバルな状態をすべてアンドゥすべきである。通常、
unload-feature
は、他のライブラリが依存している ライブラリのアンロードは拒否する。 (ライブラリaでbをrequire
(要求)していると、 ライブラリaはライブラリbに依存している。) 省略可能な引数forceがnil
以外であると、 依存関係を無視し、任意のライブラリをアンロードできる。
関数unload-feature
はLispで書いてあり、
その動作はload-history
に基づきます。
この変数の値は、ライブラリ名をそのライブラリが定義する関数や変数の名前、 そのライブラリが提供する機能、そのライブラリが要求する機能に対応付ける 連想リストである。
各要素はリストであり、1つ1つが1つのライブラリを記述する。 リストのcarは文字列であり、ライブラリ名である。 リストの残りは、以下の種類のオブジェクトから成る。
- このライブラリで定義されたシンボル。
(require .
feature)
の形のリストであり、 要求する機能を示す。(provide .
feature)
の形のリストであり、 提供する機能を示す。
load-history
の値には、carがnil
であるような 1つの要素があってもよい。 この要素は、ファイルを訪問してないバッファ内でeval-buffer
によって 作られた定義であることを示す。
コマンドeval-region
はload-history
を更新しますが、
訪問先ファイルに対応する要素に、定義されるシンボルを追加するのであって、
要素を置き換えるのではありません。
あらかじめロード済みのライブラリは、load-history
に寄与しません。