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

时间:2009-12-03 03:26:42

标签: data-structures hash dictionary lisp

你可以在Lisp中使用哈希表或dicts吗?我的意思是数据结构是对(键,值)的集合,其中值可以使用键加入。

7 个答案:

答案 0 :(得分:11)

Common Lisp至少有四种不同的方法(键值存储):

  • 属性列表(:foo 1:bar 2)
  • assoc lists((:foo.1)(:bar.2))
  • 哈希表
  • 要设置的CLOS对象(slot-value foo'bar)和要设置的(setf(slot-value foo'bar)42)。插槽名称可以存储在变量中:( let((name'bar))(slot-value foo name))。

对于简单的用法,可以使用关联列表或属性列表。随着元素数量的增加,它们往往变得“慢”。哈希表“更快”,但有自己的权衡。像许多其他对象系统一样使用CLOS对象。键是CLOS类中定义的插槽名称。虽然可以编程可以在访问时添加和删除插槽的变体。

答案 1 :(得分:9)

如果您指的是Common Lisp,hash tableshash-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"

请参阅http://clojure.org/data_structures

答案 4 :(得分:2)

不确定。这是在Scheme中定义标准哈希表库的SRFI:

http://srfi.schemers.org/srfi-69/srfi-69.html

答案 5 :(得分:1)

内置hash tables,它使用系统哈希函数(通常是SXHASH),你可以在这里使用几个不同的相等检查器(EQ,EQL,EQUAL或EQUALP取决于你认为的“同样的“关键”。

如果内置哈希表不够好,那么还有a generic hash table库。它将接受任何一对“哈希生成器”/“密钥比较器”并构建一个哈希表。但是,它依赖于良好的哈希函数才能正常工作,而且写入并不一定是微不足道的。

答案 6 :(得分:0)

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