我对结构的理解是它有插槽来存储数据,具有类型,具有make-X
和插槽访问器功能,并且可以通过方法专门处理(因为它具有类型).
我对一个类的理解是它具有所有相同和多重继承.这个问题的最佳答案表明结构可以具有单一继承,并且CLOS的初始实现比结构"慢得多".
根据人们如何谈论CLOS和结构,我认为必须存在其他一些差异,但我的琐碎谷歌搜索却毫无结果.所以我问:CLOS和结构之间有什么实际区别?
结构
结构更原始.它们提供了通常被称为编程语言的记录.它们是在课前发明的.1984年CLtL1(第一本描述Common Lisp的书)已经有了结构,后来增加了一个名为CLOS的标准对象系统.结构提供
一个简洁的定义宏 DEFSTRUCT
单继承
快速插槽访问
定义插槽的读取器和setf访问
定义类型谓词
定义构造函数
定义了一个复制功能
印刷表示:可以读取和打印结构
以上功能可能内联
有用的补充:
除结构类型外,DEFSTRUCT还可以定义基于列表和矢量的结构表示
限制:
更改结构类型后,不更新结构实例
如果更改了结构类型,最好重新编译并重新运行更改的代码.也许重启程序.重新定义结构的效果在标准Common Lisp中是未定义的.
很少内省:便携式Common Lisp并没有以简单的方式告诉我结构的超级/子结构.便携式Common Lisp并没有告诉我结构的插槽.
默认情况下,不通过插槽名称访问插槽
扩展
某些实现在一些CLOS函数中提供了更多的运行时内省和一点点集成
CLOS课程
CLOS是在80年代中期/晚期基于两个早期的对象系统(Flavors和LOOPS)发明的.它提供:
一个定义的宏 DEFCLASS
多重继承
创建,初始化等协议
可以在运行时根据类更改(新插槽,重新定义的插槽,删除的插槽,更改的继承,...)更改和更新CLOS对象
CLOS对象可以更改其类并在运行时更新
可以通过插槽名称访问
局限性:
没有默认打印机/阅读器
DEFCLASS
定义不是很简洁
扩展
通过添加的实现特定功能更快地访问插槽
元对象协议提供了额外的功能和灵活性:内省和反思.有时只提供部分MOP.
用户提供的扩展可用,特别是对于支持MOP的实现
Common Lisp
在某些情况下,Common Lisp标准没有说明应该如何实现功能:结构,类,甚至可能是其他东西.例子是流和条件.如果Common Lisp实现使用CLOS,那通常是一个好兆头(为了增加灵活性).