【问题标题】:Providing and Requiring Emacs Lisp Package Sub-features (How to)提供和要求 Emacs Lisp 包子功能(如何)
【发布时间】:2017-07-10 10:22:33
【问题描述】:

我已经编写 Emacs Lisp 包有一段时间了。但是,我还没有找到/遇到使用 require 并提供子功能的 SINGLE 示例。老实说,Emacs Lisp 手册中给出的解释绝对是可笑的。它告诉您为什么要使用子功能,但没有说明如何使用它们。它甚至没有告诉您 require 和 provide 中的子功能参数是否应该是路径或文件名中文件的符号。因此,我的问题...

有人可以提供一个非常简单的例子来说明子功能是如何工作的吗? 具体来说:

  1. 您能否举个简单的示例,说明一个提供一个功能和两个子功能的软件包?
  2. 你能给我一个例子,要求上面的特性和1中的包提供的两个子特性之一

非常感谢,

巴勃罗

【问题讨论】:

    标签: emacs package elisp


    【解决方案1】:

    免责声明:在阅读此问题之前,我什至不知道子功能是一回事。

    子功能似乎适用于可能在一个平台(例如 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 中的另一个示例是 files.el 中的 providetramp-compat.el 中对应的 featurep

    看起来require 根本不关心子功能;它的工作是在未加载的情况下加载一个特征,并且一个特征与所有子特征一起加载。子特征被实现为特征符号的subfeatures 属性中的列表,例如(get 'foo 'subfeatures) -> (bar baz)。看起来 provide 覆盖了该属性,因此只有最后一次调用 provide 是相关的。

    【讨论】:

    • 感谢您的努力。这是我从 Emacs 手册中了解到的。但是,我仍然不清楚如何编写和使用子功能。我确实明白为什么需要它们的子功能。我不明白如何编写和使用它们。我怀疑(但没有尝试过)一个分成多个文件的包可能有一个“主”文件,其中包括其他“较小”文件的提供状态。这样,人们可以使用复杂的多文件包中需要的部分,而无需加载整个包。如果这真的有效,我会报告。同样,这只是一个怀疑。
    • 但是我说了如何编写和使用它们。你给provide一个额外的列表并使用featurep和一个额外的arg来测试它们。 require 不关心子功能,因此无论是否有子功能,您都将加载整个功能。使用单独的功能加载包的单独部分。子功能表示某项功能中可能存在也可能不存在的某种功能。
    • 我在 lisp 中找到了一个例子,我已经更新了答案。
    • 所以你根本不用require 子功能;但是在需要(整个)功能之后,您可以在运行时测试是否提供了给定的子功能。
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多