Common lisp 比较CLOS对象

Common lisp 比较CLOS对象,common-lisp,clos,Common Lisp,Clos,我想知道为什么在CommonLisp中没有内置的相等运算符来比较CLOS对象(标准类)。例如,“equalp”可以应用于数组、结构、哈希表,但不能应用于对象 我假设一个新的测试可以对一个对象进行下降,并检查插槽值是否相等。程序员可以编写这个测试,但我想知道这不是标准的一部分是否有原因,因为我认为这是一个相当常见的事情?例如,“make hash table”的测试函数似乎必须是内置函数之一*,因此,我不知道如何将对象用作哈希表中的键或值 *我注意到有一个相关的问题(),但它并没有真正回答我的问题

我想知道为什么在CommonLisp中没有内置的相等运算符来比较CLOS对象(标准类)。例如,“equalp”可以应用于数组、结构、哈希表,但不能应用于对象

我假设一个新的测试可以对一个对象进行下降,并检查插槽值是否相等。程序员可以编写这个测试,但我想知道这不是标准的一部分是否有原因,因为我认为这是一个相当常见的事情?例如,“make hash table”的测试函数似乎必须是内置函数之一*,因此,我不知道如何将对象用作哈希表中的键或值

*我注意到有一个相关的问题(),但它并没有真正回答我的问题

谢谢,干杯


我不能给出一个明确的答案,但我怀疑部分原因是: 在最终确定的规范之后,将CLO添加到ANSI CL中

请注意,
equalp
按预期在s上工作。 还请注意,结构具有 虽然我缺少它

然而,这可能并不像一开始想象的那么大的疏忽

CLOS对象的重量可能相对较重; 鉴于此 是
找出对象相等性可以很快地转化为比较函数。

请参阅示例:通常,如果要比较两个对象,您要么要检查它们是否是相同的对象,这可以使用
EQ
(也适用于哈希表),要么要检查特定的插槽是否相等,这自然要求您编写自己的比较函数。通过一点MOP,您可以编写通用的相等性测试,比如说
EQUAL?
,它对除类实例以外的所有对象(即
STANDARD-OBJECT
)执行
EQUAL?
,并对所有插槽执行
EQUAL?
(当然,您必须首先检查对象是否属于同一类,并设置一个边界)。虽然速度慢,但在99%的情况下,您可能希望使用
EQ
,如果其参数是相同的对象,则返回true,这有什么错?