)) 无?,common-lisp,hashtable,equality"/>

首页 > 解决方案 > 为什么是(等于(复制- )) 无?

问题描述

struct 类型的元素是 s 表达式。

(defstruct state
  homeS
  homeH
  homeD
  homeC
  free
  stacks)

我试图将这些对象用作哈希表的键。在我转换为结构并使用更深的 S 表达式之前,一切都运行良好。当我更改为 defstruct 时,哈希表从未成功找到重复键。

哈希表是用 制作的(make-hash-table :test #'equal),所以我查看了 equal 的行为。

我希望(equal (copy-state state1) state1)返回 t,但它返回 nil。

我在 Common Lisp Hyper-Specification 中没有找到这个。我认为答案是编写自己的测试和哈希函数,并将它们交给 make-hash-table。

这必须定义为常见的 lisp 行为——它在 CLISP 和 SBCL 中的工作方式相同。

标签: common-lisphashtableequality

解决方案


根据 Common Lisp Hyper Specification,自然运算“equal”不适用于 defstruct 和 defarray 对象等结构化数据。

在这种情况下,对于由 defstruct 类型定义的对象,“equal”运算符不起作用,而使用不同的运算符“equalp”来比较结构化数据。


推荐阅读