你可以在Lisp中使用哈希表或dicts吗?我的意思是数据结构是对(键,值)的集合,其中值可以使用键加入。
答案 0 :(得分:11)
Common Lisp至少有四种不同的方法(键值存储):
对于简单的用法,可以使用关联列表或属性列表。随着元素数量的增加,它们往往变得“慢”。哈希表“更快”,但有自己的权衡。像许多其他对象系统一样使用CLOS对象。键是CLOS类中定义的插槽名称。虽然可以编程可以在访问时添加和删除插槽的变体。
答案 1 :(得分:9)
如果您指的是Common Lisp,hash tables由hash-table
类型提供。
Using these tables涉及使用功能make-hash-table
创建一个,使用gethash
读取值,使用gethash
作为place与{{3}一致地设置它们使用setf
删除条目。
从键值到哈希码的映射在具有函数remhash
的哈希表之外可用。
答案 2 :(得分:7)
当然 - Common Lisp有hash tables。
(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
属性列表适用于非常小的示范目的示例,但是对于任何实际需要,它们的性能都很糟糕,因此请使用哈希表。
答案 3 :(得分:5)
Clojure有一个内置的地图类型:
user=> (def m {:foo "bar" :baz "bla"})
#'user/m
user=> (m :foo)
"bar"
答案 4 :(得分:2)
不确定。这是在Scheme中定义标准哈希表库的SRFI:
答案 5 :(得分:1)
内置hash tables,它使用系统哈希函数(通常是SXHASH),你可以在这里使用几个不同的相等检查器(EQ,EQL,EQUAL或EQUALP取决于你认为的“同样的“关键”。
如果内置哈希表不够好,那么还有a generic hash table库。它将接受任何一对“哈希生成器”/“密钥比较器”并构建一个哈希表。但是,它依赖于良好的哈希函数才能正常工作,而且写入并不一定是微不足道的。
答案 6 :(得分:0)
在Lisp中,它通常被称为属性列表。