types - Lisp 中的哈希表类型

标签 types lisp common-lisp hashtable

我发现,在 CL 哈希表中有一个 HASH-TABLE 类型(令人惊讶)。然而,向量可以只是 VECTOR,但也可以进一步指定为(向量编号 12),例如。

哈希表似乎很自然地具有列表类型,例如 (hash-table number cons) 或其他东西,但它似乎不起作用,而且我找不到任何对它的引用。有什么建议吗?

最佳答案

TL;DR 类型化向量可能针对内存使用进行了优化,但类型化哈希表大多毫无意义。


免责声明:这主要是基于直觉,甚至离权威答案还差得很远。

类型化向量很有用,因为它们是在内存中连续存储数据的最实用方法——如果您知道所有元素的类型(并且由于知道类型,还有大小),分配足够的内存就很简单了将它们全部存储在一起。您可能已经知道,CL 的位向量就是这样:对最佳存储的、可单独访问的位的抽象。如果没有类型信息,您必须存储指向分散的实际数据片段的指针向量。

如果您熟悉简单哈希表的实现方式,那么您就会知道类型信息在这里用处不大。将实际数据存储在表中有点尴尬(通常是指针向量),要么是因为处理哈希键冲突变得更加困难(否则你最终会得到一个链表),要么是因为调整大小该表将涉及将所有数据复制到新表,而不是仅仅更改几个指针。当然,调整向量的大小也需要复制所有内容,但它是一步完成的,而对于哈希表,必须对每个元素执行一次,因为它们在表中的位置会发生变化。几乎没有任何好处。

此外,类型化的哈希表听起来不太 Lispy。

关于types - Lisp 中的哈希表类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52674209/

相关文章:

types - SML 算术函数的类型被推断为 int

c++ - 将 QVariant 中的枚举转换为整数

lisp - 常见的lisp中的mapcan会改变参数的值吗?

lisp - 反向 LISP 列表到位

lisp - 如何让 defun 接受一个列表作为它的参数

mysql - SBCL 中的 clsql 问题

common-lisp - 错误: Unbound variable: *AJAX-PROCESSOR* using HT-SIMPLE-AJAX

c - ssize_t 在 Linux 中定义在哪里?

lisp - 从 Common Lisp 中运行 `create-react-app`

haskell - 了解复杂的类型签名