为什么elisp没有名称空间?


40

问:为什么elisp没有名称空间,我们如何获得它们?

Elisp除了全局名称空间外没有其他名称空间,这导致了编码约定,即为所有全局函数,变量和常量加上唯一的前缀。

除了烦人的因素外,考虑到以下因素,这还令我感到震惊:1)强大的库和程序包数量不断增加,以及2)遗留不遵守前缀约定的传统函数和变量的持续存在,或者具有足够的特质,因此实际上并没有一个好的前缀选项可以使用。这也意味着定期尝试对较旧的代码进行合理化(例如从cl到的转换cl-lib)是一项艰巨的工作。(尽管我为清理感到高兴,但每次输入诸如此类的文字时,我还是会流下眼泪cl-find。)

我四处逛逛,看看是否能找出为什么elisp在使用了几十年后仍然没有命名空间,但对适度的收获感到有些惊讶。关于名称空间Wiki页面很短。 Nic Ferrier对这个问题的处理时间稍长,并且在emacs-devel上也有一个相当新的话题。从2010年开始就有一个旧的Stack Overflow线程,讨论使用宏实现名称空间的可能性。宏方法的另一个示例可以在这里找到。至少有两种实现(在这里这里,并在此处描述后者)),但他们已经有两年没有看到太多活动了,而且我还没有遇到任何使用它们的图书馆。

我认为,如果添加名称空间很容易,那就已经可以了。所以:

  • 向elisp添加名称空间的技术障碍是什么?
  • 添加名称空间会破坏很多现有代码吗?
  • 此功能是否需要有机地消除(对解释器本身的更改),还是真的可以通过宏在顶部构建?

6
您可以看一下:github.com/Bruce-Connor/names这似乎是自动命名空间的向后兼容(使用当前的手动分离名称方法)。(而且我99%的确定我已经看到了另一个这样的库,允许开发人员导出带有名称空间的功能子集,这在emacs博客上最近有所提及,但我找不到它)。
T. Verron 2014年

2
第二,您应该看看上面的链接。这是一个非常新的(上个月发布)并且非常强大的名称空间宏。关于与edebug之类的工具的兼容性,我仍在研究中的一些问题,但是该软件包有效。回答您的问题是一篇很长的文章(我遇到的技术障碍很多),但是我将在接下来的几周内尝试将其放入博客文章中。
马拉巴巴2014年

1
我猜名称空间的含义不同。我会说emacs有几个命名空间:一个用于变量,另一个用于函数和宏,另一个用于面部和主题,以及……
Harald Hanche-Olsen 2014年

1
@ HaraldHanche-Olsen你当然可以这么说。在这种情况下,他在问为什么没有按包命名空间。
马拉巴巴

Answers:


28

为什么没有命名空间?

因为它很复杂,而且还没有人认为它迫切需要采取全面的措施。之前在开发者列表中已经讨论了这一点(不止一次),并且有希望在移至git之后对其进行修复。

同时,我编写了自己的解决方案(请参阅下面的选项列表)。

有哪些技术障碍?

就在门外,您需要克服3个大障碍,以便命名空间甚至有机会在当前的Emacs上工作:

  • 您需要更改符号的嵌入方式(这是简单的部分)。
  • 字节编译器需要了解名称空间。
  • package.el需要了解名称空间使用的自动加载生成。

修补这三件事以配合使用,但是您要实现名称空间并非易事。如果您只致力于最新的Emacs版本,那肯定是可行的。如果您要编写某种也支持早期版本(例如整个24系列)的程序包,那么这将是一项艰巨的挑战。

除此之外,还有许多其他可选障碍。Elisp之所以出色,是因为您可以使用工具中的所有功能,并且所有 这些功能都需要打补丁才能与名称空间一起使用。其中最重要的是:

  • 臭虫
  • 评估
  • eval-last-exp
  • 粘液

它会破坏很多现有代码吗?

如果您做对了,那就不是。

这是需要有机的东西吗,还是真的可以通过宏在上面构建?

理想情况下,它将是有机的,这就是在开发人员列表中经常讨论的内容。但是当它建立在顶部时,可以做得足够好
以下是一些示例,摘自以下列表


1
谢谢-这是一个非常有用的问题。我对您的最后一点感到好奇:您的names解决方案。我不知道是否有任何理由怀疑一个有机的,内置的解决方案是在不太遥远的将来到来,或者我们应该采用内置解决方案,您所提供。

1
@丹是的,有。。也就是说,没有理由在此期间不采用名称。它与Emacs的约定完全兼容,因此任何使用Names的软件包都可以随时随时停止使用Names,并且用户一无所知。
马拉巴巴

您真的应该添加nameless到此列表中:)这是一个绝妙的主意,它非常巧妙地解决了问题。
克莱门特

22

上一次在emacs-devel上进行讨论时,当类似Lars的人指出他们希望能够M-x grep有所作为时,讨论停止了。向Elisp添加名称空间应该不会太难,但是让所有熟悉的工具正确处理它们是另一个问题。


我认为可以通过为最常用的常用功能(或它们的全部)创建别名来轻松地“修复”
Jesse

1
通常在开发软件包时就会显示“ grep”的需要,而您需要知道其他软件包中可能在何处使用了变量/函数,因此它可以应用于任何任意变量/函数,而不仅仅是特定的重要变量/函数。因此,添加一些别名不会有任何区别。麻省理工学院无济于事的另一个原因是,添加别名不会帮助您找到不使用该别名的用途。
Stefan
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.