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

Jua*_*nti 6 lisp hash dictionary data-structures

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

Rai*_*wig 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类中定义的插槽名称.虽然可以编程可以在访问时添加和删除插槽的变体.


seh*_*seh 9

如果您指的是Common Lisp,则哈希表由一个名为的类型提供hash-table.

使用这些表包括创建一个与功能make-hash-table,具有阅读价值gethash,通过将它们设置gethash为一个地方与演唱会setf,并与删除条目remhash.

从键值到哈希码的映射在具有该函数的哈希表之外可用sxhash.


Eli*_*sky 7

当然 - 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
Run Code Online (Sandbox Code Playgroud)

属性列表适用于非常小的示范目的示例,但是对于任何实际需要,它们的性能都很糟糕,因此请使用哈希表.


har*_*rto 5

Clojure有一个内置的地图类型:

user=> (def m {:foo "bar" :baz "bla"})
#'user/m
user=> (m :foo)
"bar"
Run Code Online (Sandbox Code Playgroud)

http://clojure.org/data_structures


Jer*_*fin 1

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

  • 是和否——属性列表不是哈希表,但它确实提供了一个类似字典的接口(他的问题指定“......数据结构是对(键,值)的集合,其中值可以使用密钥进行访问。”属性列表确实提供了这一点,尽管没有散列(或任何接近相同性能的东西......) (2认同)