lisp 中可以有哈希表吗?

问题描述 投票:0回答:7

Lisp 中可以有哈希表或字典吗?我的意思是数据结构是对(键,值)的集合,其中可以使用键来访问值。

data-structures hash dictionary lisp
7个回答
14
投票

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
投票

如果您指的是 Common Lisp,则 哈希表 由名为

hash-table
的类型提供。

使用这些表涉及使用函数

make-hash-table
创建一个表,使用
gethash
读取值,通过使用
gethash
作为 place
setf
配合来设置它们,以及使用
remhash
删除条目。

可以使用函数

sxhash
在哈希表之外实现从键值到哈希码的映射。


5
投票

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

user=> (def m {:foo "bar" :baz "bla"})
#'user/m
user=> (m :foo)
"bar"

参见 http://clojure.org/data_structs


2
投票

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

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


2
投票

有内置的哈希表,它使用系统哈希函数(通常是 SXHASH),并且您可以在其中使用几个不同的相等检查器(EQ、EQL、EQUAL 或 EQUALP,具体取决于您认为“相同”的内容)键)。

如果内置哈希表不够好,还有通用哈希表库。它将接受任何一对“哈希生成器”/“密钥比较器”并为您构建一个哈希表。然而,它依赖于良好的哈希函数才能正常工作,并且编写起来并不一定简单。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.