当前位置:  开发笔记 > 编程语言 > 正文

Common Lisp中struct和class的区别

如何解决《CommonLisp中struct和class的区别》经验,为你挑选了1个好方法。

我对结构的理解是它有插槽来存储数据,具有类型,具有make-X和插槽访问器功能,并且可以通过方法专门处理(因为它具有类型).

我对一个类的理解是它具有所有相同和多重继承.这个问题的最佳答案表明结构可以具有单一继承,并且CLOS的初始实现比结构"慢得多".

根据人们如何谈论CLOS和结构,我认为必须存在其他一些差异,但我的琐碎谷歌搜索却毫无结果.所以我问:CLOS和结构之间有什么实际区别?



1> Rainer Joswi..:

结构

结构更原始.它们提供了通常被称为编程语言的记录.它们是在课前发明的.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,那通常是一个好兆头(为了增加灵活性).


@MasterMastic:像更改对象一样进行更改,使其成为不同类的实例吗?a)考虑任何您想更新的长期运行的东西:在开发环境或应用程序中。您可能有一个Lisp应用程序,要为其加载软件补丁程序而又不终止该应用程序。b)一个典型的简单事情是,一旦应用程序对事物有了更多的了解,就可以将一个对象更改为一个更特殊的类。哦,TCP流实际上是POP3流...将流实例更改为pop3流类。
推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有