Common lisp 为什么(相等(复制-<;某些结构类型>;<;结构类型对象>;)<;相同结构类型对象>;)为零?

Common lisp 为什么(相等(复制-<;某些结构类型>;<;结构类型对象>;)<;相同结构类型对象>;)为零?,common-lisp,hashtable,equality,Common Lisp,Hashtable,Equality,结构类型的元素是s表达式 (defstruct state homeS homeH homeD homeC free stacks) 我试图将这些对象用作哈希表的键。在我转换为struct并使用更深层的S表达式之前,一切都很好。当我更改为defstruct时,哈希表从未成功地找到重复的键 hashtable是用(makehashtable:test#'equal)创建的,因此我研究了equal的行为 我期望(相等(复制状态state1)state1)返回t,但它返回ni

结构类型的元素是s表达式

(defstruct state
  homeS
  homeH
  homeD
  homeC
  free
  stacks)
我试图将这些对象用作哈希表的键。在我转换为struct并使用更深层的S表达式之前,一切都很好。当我更改为defstruct时,哈希表从未成功地找到重复的键

hashtable是用
(makehashtable:test#'equal)
创建的,因此我研究了equal的行为

我期望
(相等(复制状态state1)state1)
返回t,但它返回nil

我在通用Lisp超规范中没有发现这一点。我认为答案是编写我自己的测试和哈希函数,并给它们生成哈希表


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

根据公共lisp超规范,自然操作“equal”不适用于结构化数据,如defstruct和defarray对象

在这种情况下,对于defstruct类型定义的对象,“equal”操作符不起作用,而另一个操作符“equalp”用于比较结构化数据