【发布时间】:2014-10-02 06:23:11
【问题描述】:
我有一个 Emacs Lisp 程序,它需要跟踪一组字符串,使用它们完成并测试其他字符串是否属于该组。在大多数没有内置 set 类型的语言中,我会使用带有虚拟 t 或 1 值的字典或哈希表,但我想到 Elisp 的 obarray 类型也可以用于目的,用intern、intern-soft 和unintern 代替puthash、gethash 和remhash。
(我知道 cl-lib 函数将列表作为集合进行操作,但这些函数与这个问题并不特别相关,只需要一个集合成员资格测试)。
在现代 Emacs 中使用 obarray 而不是哈希表是否有任何优势(在速度、内存使用或其他方面),或者除了主符号表之外的 obarray 更多是 Emacs Lisp 之前的遗留物吗?哈希表类型?
【问题讨论】:
-
从我读到的。你所能做的就是在一个新的 obarray 中的 intern 和 unintern 值,但是没有办法访问或修改与符号关联的值。
-
这不太对——你可以像普通符号一样使用
symbol-value和set:(let* ((o (make-vector 11 0)) (s (intern "s" o))) (set s 'value) (symbol-value s))→value。但在这种情况下,无论如何,实习和取消实习就足够了。 -
我怀疑 obarray 在表示集合时可能比散列表更节省空间,因为散列表浪费了每个键的单个值槽,而 obarray 浪费了至少三个,因为每个符号都有一个值、函数和 plist 槽。