ライブラリによってロードされた関数や変数を破棄することで、他の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
は、ロード済みの他のライブラリが依存しているライブラリのアンロードを拒否します。(a に b 用の require が含まれている場合、ライブラリ
a はライブラリ b に依存します。)オプション引数
force が nil
以外の場合、依存関係は無視され、任意のライブラリをアンロードできます。
unload-feature関数はLispで記述されており、その動作は変数load-historyに基づいています。
この変数には、ライブラリのアンロード前にスキャンしてライブラリ内で定義された関数を削除するためのフックのリストが格納されています。