emacs - 如何在Emacs Lisp中获取唯一的对象ID?

标签 emacs elisp

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”,位于两者之间。

(编辑:我的原始答案可能不清楚为什么eqequal之间的区别可能解决了原始海报所具有的问题)

关于emacs - 如何在Emacs Lisp中获取唯一的对象ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122891/

相关文章:

windows - 修复以在 emacs 中平滑滚动?

emacs - 如何关闭 emacs 中的调试消息

emacs - 如何让 Emacs 使用制表符而不是空格?

emacs - 当光标移出屏幕时禁用屏幕跳转

c# - cc 模式下的智能电动支架(C#、Java 等)

emacs - 可以在 term-char-mode 和 term-line-mode 子模式之间切换的功能?

emacs - 在 emacs 中自动转义拉出的字符串

emacs - Elisp 调试器不弹出

emacs - 如何在 elisp 中创建信号处理程序?

emacs - 从 elisp 正确调用交互式脚本