何时使用它,为什么?
我的问题来自这句话:“对某些类进行哈希处理并将它们的实例与引用相等性进行比较”
来自 Odersky、Spoon 和 Venners(2007 年),Scala 编程,Artima Press,p。243:
您通过缓存您在弱集合中创建的所有实例来散列类的 cons 实例。然后,任何时候你想要一个新的类实例,你首先检查缓存。如果缓存已经有一个元素等于你要创建的元素,你可以重用现有的实例。由于这种安排,任何两个与 equals() 相等的实例也与引用相等相等。
把大家的答案放在一起:
ACL2(A Computational Logic for Applicative Common Lisp)是一个软件系统,由编程语言、一阶逻辑中的可扩展理论和机械定理证明器组成。
--维基 ACL2
在计算机编程中,cons(发音为 /ˈkɒnz/ 或 /ˈkɒns/)是 Lisp 编程语言的大多数方言中的基本功能。cons 构造(因此得名)包含两个值或指向值的指针的内存对象。这些对象被称为 (cons) 单元格、conses 或 (cons) 对。在 Lisp 行话中,“to cons x on y”表示用 (cons xy) 构造一个新对象。结果对具有左半部分,称为汽车(第一个元素)和右半部分(第二个元素),称为 cdr。
--维基缺点
从逻辑上讲,hons 只是 cons 的另一个名称,即以下是 ACL2 定理:
(等于(荣誉 xy)(缺点 xy))
Hons 通常比 cons 运行得慢,因为在创建 hons 时,会尝试查看是否已经存在具有相同汽车和 cdr 的 hons。这涉及搜索和哈希表的使用。
鉴于你的问题:
对某些类散列缺点并将它们的实例与引用相等性进行比较
这似乎hash cons
是一个散列 LISP 构造函数的过程,以确定一个对象是否已经存在,通过相等比较。
http://en.wikipedia.org/wiki/Hash_cons现在重定向。
它con
与散列一起允许eq
(参考)比较而不是深度比较。这对内存更有效(因为相同的对象被存储为引用),如果比较是一种常见的操作,当然更快。
http://www.cs.utexas.edu/~moore/acl2/current/HONS.html描述了 Lisp 的实现。