我对结构体的理解是,它有用于存储数据的插槽,有一个类型,有make-X
和插槽访问函数,并且可以通过方法进行专业化(因为它有一个类型)。
我对类的理解是,它具有相同的功能和多重继承。this question的最佳答案指出,结构体可以具有单一继承,并且CLOS的初始实现比结构体“慢得多”。
基于人们谈论CLOS和结构体的方式,我认为必须存在其他差异,但是我的琐碎的谷歌搜索没有结果。因此我问:CLOS和结构体之间的实际区别是什么?
我对结构体的理解是,它有用于存储数据的插槽,有一个类型,有make-X
和插槽访问函数,并且可以通过方法进行专业化(因为它有一个类型)。
我对类的理解是,它具有相同的功能和多重继承。this question的最佳答案指出,结构体可以具有单一继承,并且CLOS的初始实现比结构体“慢得多”。
基于人们谈论CLOS和结构体的方式,我认为必须存在其他差异,但是我的琐碎的谷歌搜索没有结果。因此我问:CLOS和结构体之间的实际区别是什么?
结构体
结构体更为原始。它们在编程语言中通常被称为“记录”。它们在类之前就已经在Common Lisp中引入了。1984年的CLtL1(描述Common Lisp的第一本书)已经有了结构体,后来又添加了一个名为CLOS的标准对象系统。结构体提供了以下功能:
DEFSTRUCT
有用的附加功能:
限制:
扩展功能
CLOS类
CLOS是在80年代中期/晚期基于两个早期的对象系统(Flavors和LOOPS)发明的。它提供了:
DEFCLASS
限制:
DEFCLASS
定义不够简洁扩展:
Common Lisp
在某些情况下,Common Lisp标准没有规定如何实现某个功能:结构体、类,或者甚至其他东西。流和条件就是例子。如果一个Common Lisp实现使用CLOS来实现这些功能,通常是为了增加灵活性的好迹象。
defstruct
在幕后为您完成更多工作,例如:
print-object
方法此外,结构插槽访问速度更快(尽管差异可能微不足道)。
总之,除非您需要MOPish功能,否则可以使用defsrtuct
。
standard-object
的子类型,那么它就是一个CLOS类。对于一个条件类型:(subtypep 'error 'standard-object)
-> T或NIL。一些实现可能允许使用各种CLOS和非CLOS类型的流。 - Rainer Joswig