Lisp 中可以有哈希表或字典吗?我的意思是数据结构是对(键,值)的集合,其中可以使用键来访问值。
Common Lisp 至少有四种不同的方法来做到这一点(-> 键值存储):
(:foo 1 :bar 2)
((:foo . 1) (:bar . 2))
(slot-value foo 'bar)
用于获取,(setf (slot-value foo 'bar) 42)
用于设置。插槽名称可以存储在变量中:(let ((name 'bar)) (slot-value foo name))
.对于简单的使用,关联列表或属性列表就可以了。当元素数量较多时,它们往往会变得“慢”。哈希表“更快”,但也有其自身的权衡。 CLOS 对象的使用方式与许多其他对象系统类似。键是 CLOS 类中定义的槽名称。尽管可以对可以在访问时添加和删除插槽的变体进行编程。
当然 - 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
属性列表非常适合用于演示目的的非常小的示例,但对于任何实际需要,它们的性能很糟糕,因此请使用哈希表。
如果您指的是 Common Lisp,则 哈希表 由名为
hash-table
的类型提供。
使用这些表涉及使用函数
make-hash-table
创建一个表,使用 gethash
读取值,通过使用 gethash
作为 place 与 setf
配合来设置它们,以及使用 remhash
删除条目。
sxhash
在哈希表之外实现从键值到哈希码的映射。
Clojure 有一个内置的地图类型:
user=> (def m {:foo "bar" :baz "bla"})
#'user/m
user=> (m :foo)
"bar"
当然。这是在Scheme中定义标准哈希表库的SRFI:
在 Lisp 中通常称为属性列表。