你能在Lisp中使用哈希表吗?

6

您是否可以在Lisp中使用哈希表或字典?我的意思是数据结构,即一组成对的(键、值)集合,其中可以使用键访问值。

7个回答

13

Common Lisp有至少四种不同的方法来进行键值存储:

  • 属性列表 (:foo 1 :bar 2)
  • 关联列表 ((:foo . 1) (:bar . 2))
  • 哈希表
  • CLOS对象 (slot-value foo 'bar) 用于获取,(setf (slot-value foo 'bar) 42) 用于设置。槽名可以存储在变量中: (let ((name 'bar)) (slot-value foo name))。

对于简单的使用,关联列表或属性列表是可以的。但是当元素数量较大时,它们往往会变得'缓慢'。哈希表速度更快,但也有其自身的权衡。CLOS对象像许多其他对象系统一样使用。键是在CLOS类中定义的槽名。虽然可以编程变体,在访问时可以添加和删除插槽。


9
当然 - Common Lisp有哈希表。
(setq a (make-hash-table)) 
(setf (gethash 'color a) 'brown) 
(setf (gethash 'name a) 'fred) 
(gethash 'color a) => brown 
(gethash 'name a) => fred 
(gethash 'pointy a) => nil

属性列表适用于非常小的演示目的,但对于任何实际需求,它们的性能都很差,因此请使用哈希表。


9

5

2

2

内置了哈希表,使用系统哈希函数(通常是SXHASH),您可以拥有几个不同的相等检查器(EQ、EQL、EQUAL或EQUALP,这取决于您认为“相同”的键是什么)。

如果内置的哈希表不够好,还有一个通用哈希表库。它将接受任何一对“哈希生成器”/“键比较器”,并为您构建哈希表。但是,它依赖于有一个良好的哈希函数才能正常工作,这并不一定容易编写。


1
在Lisp中它通常被称为属性列表。

1
不,属性列表是另一回事。请参阅CLHS词汇表:http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_p.htm#property_list - Eli Barzilay
2
是的和不是的 -- 属性列表并不是哈希表,但它确实提供了类似字典的接口(他的问题指定了“一种由键值对(key, value)组成的集合数据结构,其中可以使用键访问值。”属性列表确实完全提供了这一点,尽管没有哈希(或任何接近相同性能的东西...) - Jerry Coffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接