Lisp中的哈希表类型

时间:2018-10-05 22:55:35

标签: types lisp common-lisp hashtable

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

对于哈希表来说,具有列表类型(如(哈希表编号缺点)之类的东西)似乎是很自然的,但是它似乎不起作用,而且我找不到任何引用。有什么建议吗?

1 个答案:

答案 0 :(得分:5)

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


免责声明:这主要是基于直觉,甚至与权威性答案都不太接近。

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

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

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