emacs lisp是否具有提供唯一对象标识符的功能,例如内存地址? Python有id()
,它返回一个整数,该整数保证在当前存在的对象之间是唯一的。 elisp呢?
最佳答案
我知道想要id()
这样的函数的唯一原因是比较对象,并确保它们仅在它们相同时才比较相等(例如,在相同的内存位置)。在Lisps中,这与在Python中有所不同:
在包括elisp在内的大多数lisps中,有几种不同的平等概念。最昂贵,最弱的等效项是equal
。这不是您想要的,因为如果两个列表(例如)具有相同的元素(使用equal
进行递归测试),则它们是相等的。因此
(equal (list 1 2) (list 1 2)) => T
是真的。另一端是
eq
,它测试“身份”而不是相等性:(eq (list 1 2) (list 1 2)) => NIL
我想这就是您想要的。
因此,Python似乎可以通过提供一个相等性测试来工作,然后提供一个为每个对象提供存储位置的函数,然后可以将其作为整数进行比较。另一方面,在Elisp(至少也是Common Lisp)中,“平等”的含义不只一个。
注意,还有“eql”,位于两者之间。
(编辑:我的原始答案可能不清楚为什么
eq
和equal
之间的区别可能解决了原始海报所具有的问题)
关于emacs - 如何在Emacs Lisp中获取唯一的对象ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122891/