如何将所有符号定义与特定前缀解除绑定?


11

我经常更改程序包的API,但是会在完成时company-mode提取每个定义的符号(应有的符号)。我不想意外地使用一个未绑定的名称,那么如何解除所有以例如开头的变量和函数的绑定my-package-?之后,我将能够load-file再次进行。

Answers:


10

调用unload-feature以取消定义在加载Elisp源文件或字节编译文件时定义的所有符号。通过provide在结尾处调用来确保文件结束。假设您使用load函数或via 之一加载了文件require,它不会是由C-M-xeval-defun)或类似机制定义的未定义符号。

如果您确实要根据符号的名称而不是根据定义它们的包来解除绑定,则可以使用它mapatoms来遍历所有符号。

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))

有用,但我认为这对交互式开发不会有效,正如我描述的那样。我比feature系统更深一层;我只使用函数和变量,没有任何显式分组。我没有理会评估(provide 'my-package)
肖恩·艾瑞德

2
@SeanAllred我想不出一个很好的理由不使用provide。但是无论如何,如果您真的想用肮脏的方式做事,请参阅我的编辑。
吉尔(Gilles)'所以

哦,我爱provide,我只是认为在这种情况下不起作用。如果对函数进行交互评估,函数是否还记得定义在哪个文件中?
肖恩·艾瑞德

2
unload-feature如果您评估代码而不从文件(具有provide)中加载代码,则没有任何效果。
2014年

2
@SeanAllred否,如果函数是在加载整个文件时加载的,则函数仅记住从何处加载它们。
吉尔(Gilles)'所以

7
  • 使用makunbound以除去使用一个符号的作为动态变量(即,排尿其symbol-value)。

  • 使用fmakunbound删除使用符号作为函数(即,其无效symbol-function)。

  • 使用mapatoms遍历所有符号。作用于每个其symbol-name是由你所感兴趣的特定前缀匹配:通话双方makunboundfmakunbound就可以了。

  • 您不需要unintern使用符号,除非您还对符号本身使用了补全,而不仅仅是将它们用作变量或函数。但是,如果您确实想完全删除符号,请使用unintern

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.