【发布时间】:2012-08-27 09:44:25
【问题描述】:
emacs lisp 是否具有提供唯一对象标识符的函数,例如 e.g.内存地址? Python 有id(),它返回一个整数,保证在当前存在的对象中是唯一的。那么 elisp 呢?
【问题讨论】:
-
@NicolasDudebout:我猜它是用来索引哈希表、平衡树……
-
在带有垃圾收集的语言中定义一个通用唯一的对象标识符是相当困难的。特别是,一个对象的内存地址并不像它看起来的唯一标识符那么好。实际上,
id([1, 2]) == id([3, 4])在 CPython REPL 中的计算结果为True,因为[1, 2]已被垃圾回收,而[3, 4]恰好分配在与[1, 2]相同的地址。 -
其实不是为了索引,而是为了打印。例如,打印两个同名的不同符号会产生相同的结果,但是如果我们可以打印一个数字对象标识符,我们就可以从输出中判断出在程序中不同点引用的两个符号是否在事实相同的对象。
-
小心:在大多数lisp(包括Elisp)中,同名符号是
eq。如果您的意思是要打印(list 1)和(list 1)彼此不同,我不确定在 Emacs 中是否可行。我也很难理解你为什么会关心。 -
我认为这不对。
(eq 'symbol-1 (make-symbol "symbol-1"))产生nil。当然,在处理非内部符号时,查看对象的数字标识符可能会有所帮助。