我对struct的理解是,它具有用于存储数据的插槽,具有类型,具有make-X和slot-accessor函数,并且可以通过方法进行专门化(因为它具有类型)。

我对类的理解是,它具有所有相同且多个继承。 this question的最高答案指出,结构可以具有单一继承,并且CLOS的初始实现比结构“慢得多”。

根据人们谈论CLOS和结构的方式,我认为肯定还有其他差异,但是我对Google的琐碎搜索却毫无结果。所以我问:CLOS和结构之间的实际区别是什么?

最佳答案

结构

Structures更原始。它们提供了通常被称为编程语言的记录。它们是在上课之前发明的。 1984年,CLtL1(第一本描述Common Lisp的书)已经具有结构,后来又添加了一个称为CLOS的标准对象系统。结构提供

  • 简洁的定义宏DEFSTRUCT
  • 单继承
  • 快速插槽访问
  • 定义插槽
  • 的读取器和setf访问
  • 定义类型谓词
  • 定义构造函数
  • 定义一个复制函数
  • 打印表示:可以读取和打印结构
  • 上面的函数
  • 可能是内联的

  • 有用的补充:
  • 除了结构类型
  • 外,DEFSTRUCT还可以定义结构的基于列表和向量的表示形式

    局限性:

    更改结构类型后的
  • ,不会更新结构实例
  • 如果更改了结构类型,则最好重新编译并重新运行更改后的代码。也许重新启动程序。重新定义结构的效果在标准Common Lisp中未定义。
  • 很少自省(introspection):可移植的Common Lisp不能以简单的方式告诉我结构的上/下结构。便携式Common Lisp不会告诉我结构的插槽。
  • 默认情况下不通过插槽名称访问插槽

  • 扩展名
  • 一些实现提供了更多的运行时自省(introspection)功能,并且在某些CLOS函数中提供了一些集成

  • CLOS类

    CLOS是在80年代中期/晚期基于两个较早的对象系统(Flavors和LOOPS)发明的。它提供:
  • 定义宏DEFCLASS
  • 多重继承
  • 用于创建,初始化等的
  • 协议(protocol)。
  • CLOS对象可以在运行时根据类更改(新插槽,重新定义的插槽,删除的插槽,更改的继承等)进行更改和更新。
  • CLOS对象可以更改其类并在运行时更新
  • 可以通过插槽名称访问

  • 局限性:
  • 没有默认打印机/阅读器
  • DEFCLASS定义不是很简洁

  • 扩展名
  • 通过添加特定于实现的功能
  • 可以更快地访问插槽
  • 元对象协议(protocol)提供了附加的功能和灵活性:内省(introspection)和反射(reflection)。有时仅提供MOP的一部分。
  • 可用
  • 用户提供的扩展,特别是对于具有MOP支持的实现。

  • 常见Lisp

    在某些情况下,Common Lisp标准没有说明应如何实现功能:结构,类,甚至其他内容。示例是流和条件。如果Common Lisp实现对这些使用CLOS,通常是一个好兆头(增加灵活性)。

    关于class - Common Lisp中的struct和class之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34244855/

    10-12 20:49