我有一个 Emacs Lisp 程序,需要跟踪一组字符串,用它们进行自动补全并测试其他字符串是否属于该集合。在大多数没有内置“set”类型的语言中,我会使用带有虚拟“t”或“1”值的字典或哈希表,但我想到 Elisp 的“obarray”类型也可以实现这个目的,使用“intern”,“intern-soft”和“unintern”代替“puthash”,“gethash”和“remhash”。
(我知道关于“cl-lib”函数,它们可以将列表作为集合操作,但对于这个问题来说并不特别相关,只需要一个集合成员资格测试)
在现代 Emacs 中,使用 obarray 而不是哈希表是否具有任何优势(例如速度、内存使用或其他方面),还是说除了主符号表之外的 obarray 更像是 Emacs Lisp 有单独的哈希表类型之前的剩余物品?
(我知道关于“cl-lib”函数,它们可以将列表作为集合操作,但对于这个问题来说并不特别相关,只需要一个集合成员资格测试)
在现代 Emacs 中,使用 obarray 而不是哈希表是否具有任何优势(例如速度、内存使用或其他方面),还是说除了主符号表之外的 obarray 更像是 Emacs Lisp 有单独的哈希表类型之前的剩余物品?
symbol-value
和set
:(let* ((o (make-vector 11 0)) (s (intern "s" o))) (set s 'value) (symbol-value s))
→value
。但在这种情况下,内部化和取消内部化本来就足够了。 - user725091