他のLispオブジェクト用にメモリーを回収するために、ライブラリーによりロードされた関数や変数を破棄することができます。これを行うには関数unload-feature
を使用します:
このコマンドはフィーチャfeatureをプロバイドしていたライブラリーをアンロードする。そのライブラリー内のdefun
、defalias
、defsubst
、defmacro
、defconst
、defvar
、defcustom
によって定義されたすべての関数、マクロ、変数は未定義になる。その後に、それらのシンボルにたいして事前に関連付けられていたオートロードをリストアする(ロードはシンボルのfunction-history
プロパティにこれらを保存している)。
以前の定義をリストアする前に、特定のフックからライブラリーが定義した関数を取り除くために、unload-feature
はremove-hook
を実行する。これらのフックには名前が‘-hook’(または廃止されたサフィックス‘-hooks’)で終わる変数、加えてunload-feature-special-hooks
、同様にauto-mode-alist
にリストされた変数も含まれる。これは重要なフックがすでに定義されていない関数を参照をすることにより、Emacsの機能が停止することを防ぐためである。
標準的なアンロードアクティビティでは、そのライブラリー内の関数のELPプロファイリング、そのライブラリーによりプロバイドされたフィーチャ、そのライブラリーで定義された変数に保持されたタイマーをアンドゥする。
これらの基準が機能不全を防ぐのに十分でなければ、ライブラリーはfeature-unload-function
という名前の明示的なアンローダーを定義できる。そのシンボルが関数として定義されていたら、unload-feature
は何かを行う前にまず引数なしでそれを呼び出す。これはライブラリーのアンロードのために適切なすべてのことを行うことができる。これがnil
をリターンしたら、unload-feature
は通常のアンロードアクションを処理する。それ以外ならアンロード処理は完了したとみなす。
unload-feature
は通常は他のライブラリーが依存するライブラリーのアンロードを拒絶する(ライブラリーbにたいするrequire
がライブラリーaに含まれるなら、aはbに依存している)。オプション引数forceが非nil
なら依存関係は無視されて、どのようなライブラリーもアンロードできる。
unload-feature
関数はLispで記述されており、その動作は変数load-history
にもとづきます。
この変数はライブラリー内で定義された関数を取り除くために、ライブラリーをアンロードする前にスキャンするフックのリストを保持する。