我写 Emacs Lisp 包已经有一段时间了。但是,我还没有找到/遇到使用 require 和提供子功能的单个示例。老实说,Emacs Lisp 手册中给出的解释绝对是可笑的。它会告诉您为什么要使用子功能,但没有说明如何使用它们。它甚至不会告诉您 require 和 provide 中的子功能参数是否应该是路径或文件名中文件的符号。因此,我的问题...
有人可以提供一个非常简单的子功能如何工作的例子吗?
具体来说:
非常感谢提前,
巴勃罗
最佳答案
免责声明:在我阅读这个问题之前,我什至不知道子功能是一回事。
子功能似乎用于复杂功能,这些功能可能在一个平台(例如 Linux)上具有某些功能,但在另一个平台(例如 Windows)或某些类似情况下没有。该功能的用户可以测试子功能并在它不存在时执行变通方法。
至于使用子功能,您只需添加一个列表参数,如 (provide 'foo '(bar baz))
,但更有可能使用一些以编程方式生成的列表,例如
(setq foo--subfeatures ())
(when (barp)
(setq foo--subfeatures (cons 'bar foo--subfeatures)))
(provide 'foo foo--subfeatures)
然后用
(featurep 'foo 'bar)
测试确保foo
有 bar
子功能。子功能只是符号。带有子功能的功能的内置示例是 make-network-process
,它是用 C 实现的,但即使你不熟悉 C,子功能机制也应该很清楚。lisp 中的另一个例子是 provide
在 files.el
和相应的 featurep
在 tramp-compat.el
.看起来不像
require
完全关心子功能;它的工作是加载一个未加载的功能,并且一个功能加载了所有子功能。子功能在 subfeatures
中实现为列表特征符号的属性,例如(get 'foo 'subfeatures) -> (bar baz)
.它看起来像 provide
覆盖该属性,因此只有最后一次调用 provide
是相关的。
关于emacs - 提供和要求 Emacs Lisp 包子功能(如何),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45009575/