你可以丢弃由某个库加载的函数和变量,以回收内存供其他 Lisp 对象使用。
为此,请使用函数 unload-feature:
该命令卸载提供了 feature 功能的库。
它会取消定义该库中通过 defun、defalias、subst、
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。
该变量保存一个钩子列表,在卸载库时会扫描这些钩子,以移除库中定义的函数。