Common lisp 比较CLOS对象
我想知道为什么在CommonLisp中没有内置的相等运算符来比较CLOS对象(标准类)。例如,“equalp”可以应用于数组、结构、哈希表,但不能应用于对象 我假设一个新的测试可以对一个对象进行下降,并检查插槽值是否相等。程序员可以编写这个测试,但我想知道这不是标准的一部分是否有原因,因为我认为这是一个相当常见的事情?例如,“make hash table”的测试函数似乎必须是内置函数之一*,因此,我不知道如何将对象用作哈希表中的键或值 *我注意到有一个相关的问题(),但它并没有真正回答我的问题 谢谢,干杯Common lisp 比较CLOS对象,common-lisp,clos,Common Lisp,Clos,我想知道为什么在CommonLisp中没有内置的相等运算符来比较CLOS对象(标准类)。例如,“equalp”可以应用于数组、结构、哈希表,但不能应用于对象 我假设一个新的测试可以对一个对象进行下降,并检查插槽值是否相等。程序员可以编写这个测试,但我想知道这不是标准的一部分是否有原因,因为我认为这是一个相当常见的事情?例如,“make hash table”的测试函数似乎必须是内置函数之一*,因此,我不知道如何将对象用作哈希表中的键或值 *我注意到有一个相关的问题(),但它并没有真正回答我的问题
我不能给出一个明确的答案,但我怀疑部分原因是: 在最终确定的规范之后,将CLO添加到ANSI CL中 请注意,
equalp
按预期在s上工作。
还请注意,结构具有
虽然我缺少它
然而,这可能并不像一开始想象的那么大的疏忽
CLOS对象的重量可能相对较重;
鉴于此
是
找出对象相等性可以很快地转化为比较函数。请参阅示例:通常,如果要比较两个对象,您要么要检查它们是否是相同的对象,这可以使用
EQ
(也适用于哈希表),要么要检查特定的插槽是否相等,这自然要求您编写自己的比较函数。通过一点MOP,您可以编写通用的相等性测试,比如说EQUAL?
,它对除类实例以外的所有对象(即STANDARD-OBJECT
)执行EQUAL?
,并对所有插槽执行EQUAL?
(当然,您必须首先检查对象是否属于同一类,并设置一个边界)。虽然速度慢,但在99%的情况下,您可能希望使用EQ
,如果其参数是相同的对象,则返回true,这有什么错?