根据CLOS(通用Lisp),类型系统的目的是什么?

时间:2019-02-25 20:56:46

标签: oop lisp common-lisp clos

据我了解,Common Lisp对象的内存布局(按位标记由CLOS(类)定义。

我知道每个类都有对应的类型,但不是每个类型都有对应的类,因为类型可以是复合的(列表)。我认为类型就像逻辑约束,而不是带有标记方案的具体“类型”类。

如果这是正确的,那么类型系统除了作为逻辑约束(例如,指定整数必须在一定范围内,或者数组包含特定类型)之外,还用于其他目的吗?

如果这不正确,那么根据CLOS,类型系统实际上有什么作用?谢谢。

5 个答案:

答案 0 :(得分:4)

一个对象一次只能有一个类,而它可以满足多种类型。 类型系统是一个网格,您可以在其中计算两种类型的最小上限和最大下限(分别使用orand),并允许使用顶部类型(T)以及底部类型(NIL类型,与NULL类型不同)。

Common Lisp的实现必须能够确定某个值是否属于类型,并且该值以原子类型说明符(例如characterinteger)开头,并随着复合类型说明符(可以由用户定义)。

但是这是使用标记还是通过静态分析来完成;在实践中,CL使得在某些情况下您不能精确地静态确定对象的类型(T除外),仅仅是因为可以在以后重新定义对象:您不能假定其类型是固定的(例如:函数;这就是为什么内联或全局声明可能有助于类型推断的原因。

但是,如果您具有可以保证类型不变的作用域,则编译器可以自由使用未装箱的数据类型来存储值。那么您就没有标记数据。在局部声明变量类型的情况就是如此,对于专用数组也是如此:一旦构建了数组,其元素类型就不会随时间变化,并且在某些情况下,知道一个数组仅包含(integer 0 15)个元素就可以了。用于更有效地打包数据。

答案 1 :(得分:3)

  1. CLOS是在游戏后期添加到CL的(不是唯一为CL设计的对象系统)

  2. 即使使用CLOS,编译器也可以使用类型系统进行优化,并且用户可以使用其推断代码。

答案 2 :(得分:1)

类型是一组值。

类型说明符是一种简洁表示类型的方法。

实施可以进行各种标记和注册,以帮助他们区分事物的类型,但这不是类型概念所固有的。

类是描述一组其他对象的对象。由于具有这样一个集合(类型)的简洁名称非常有用,Common Lisp将类名称注册为对应对象集的类型说明符。这就是类型与类的整体关系。

答案 3 :(得分:1)

我认为重要的是要远离事物的实现,而要专注于语言对事物的看法。显然,实现需要有足够的信息来了解给定对象是什么种类的东西,并且它将通过某种“标签”来实现(可能会或可能不会在对象上附加一些额外的位)例如,它可能是地址的前导位)。在下文中,我将其称为“代表性类型”。但是您实际上几乎无法从该语言访问该实现细节。容易想到,type-of会告诉您将1-1映射到表示形式上的内容,但事实并非如此:例如,(type-of (cons 1 2)被允许返回(cons integer integer),我认为可能被允许返回(cons integer number)(cons (integer 1 1) (integer 2 2))。所有这些都不大可能有不同的表示类型:确实没有 是因为(type-of 1)可以返回(integer m n)的{​​{1} }和m

因此,这里介绍了语言在CL中对事物的看法以及类和类型之间的差异。

类型系统和类系统均由类型/类的边界晶格组成。成为 lattice 意味着对于任何一对对象,都有一个唯一的极值(因此,对于类型来说,这两个类型都是子类型的唯一类型,而没有为真的子类型)很少(相反)。被限制表示存在顶部和底部类型/类。

  • 类是一流的对象(例如,您可以将类存储在变量中)。
  • 所有对象(包括类)都属于一个类,并且有一个定义明确的运算符来查找任何对象所属的直接类。
  • 类别有限。
  • 对象的类与其表示形式非常接近,但不完全对应(例如,可能存在专门的数组类型,它们没有相应的类)。
  • 类可以用作类型:n(type-of 1 (class-of 1))一样有效(答案分别为(subtypep (class-of 1) '(integer 0 1))t。)

类型

类型是表示具有共同属性的对象的集合的方法,但它们本身并不是对象:它们(如果有的话)只是事物集合的名称-语言规范称为这些“类型说明符”。特别是有无限多种类型:例如,考虑类型nil, t。少数这种类型的不确定性与表示类型相对应-表示系统是什么东西的实际信息-但显然大多数都没有。可能有代表性类型没有相应的类型。

我认为类型实际上有三个作用。

  • 类型信息可以告诉系统要使用哪些表示类型,这可以帮助系统检查事物是否是正确的表示类型并优化事物。
  • 类型信息可以使系统进行推论,从而对事情大有帮助。
  • 类型信息可以使程序员讨论他们正在处理的是什么类型的东西,即使这些信息对系统没有帮助。系统可以将此类声明视为有关类型的断言,从而使程序更安全,更容易调试。这是类型的重要原因:即使系统不检查它们,对于阅读代码的人来说也很有用,例如,它期望[0,30]中的整数,即(integer m n) 。确实,即使系统没有自动检查声明,您也可以使用(integer 0 30)强制检查。

第二种情况很有趣。假设我有一个告诉我的系统类型为(check-type x '(integer 0 30) ...)。就表示类型而言,这极不可能比(double-float 0.0d0)有用。但是,如果我将这件事取平方根,那么知道这种类型确实非常有用:系统可以知道结果是double-float而不是double-float,并且这些类型极不可能具有代表性。因此,系统可以使用我的类型声明以这种方式进行推断(这些推断可以在程序中级联)。请注意,类不能做到这一点(至少CL的类不能做到),对象的表示形式也不能:您需要的信息更多。

是的,类型有许多非常有用的用途,而类却无法满足这些用途。

答案 4 :(得分:0)

类型系统定义执行不同操作的不同对象。对于某些程序员而言,CLOS系统更多地用于以更合乎逻辑的方式为类型定义特殊行为的方法。来自Java的CLOS系统对我来说更具逻辑性和系统性,因此它对某些程序员有作用。我喜欢将CLOS系统视为Java中的一个类,例如Integer类,以及类似于Java中的原语的类型系统。与创建结构恕我直言相比,CLOS系统只是通过一种更系统的方式帮助您使用方法扩展对象。