Common lisp 为什么(相等(复制-<;某些结构类型>;<;结构类型对象>;)<;相同结构类型对象>;)为零?
结构类型的元素是s表达式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
(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”用于比较结构化数据