据我了解,Common Lisp对象的内存布局(按位标记由CLOS(类)定义。
我知道每个类都有对应的类型,但不是每个类型都有对应的类,因为类型可以是复合的(列表)。我认为类型就像逻辑约束,而不是带有标记方案的具体“类型”类。
如果这是正确的,那么类型系统除了作为逻辑约束(例如,指定整数必须在一定范围内,或者数组包含特定类型)之外,还用于其他目的吗?
如果这不正确,那么根据CLOS,类型系统实际上有什么作用?谢谢。
答案 0 :(得分:4)
一个对象一次只能有一个类,而它可以满足多种类型。
类型系统是一个网格,您可以在其中计算两种类型的最小上限和最大下限(分别使用or
,and
),并允许使用顶部类型(T)以及底部类型(NIL类型,与NULL类型不同)。
Common Lisp的实现必须能够确定某个值是否属于类型,并且该值以原子类型说明符(例如character
或integer
)开头,并随着复合类型说明符(可以由用户定义)。
但是这是使用标记还是通过静态分析来完成;在实践中,CL使得在某些情况下您不能精确地静态确定对象的类型(T除外),仅仅是因为可以在以后重新定义对象:您不能假定其类型是固定的(例如:函数;这就是为什么内联或全局声明可能有助于类型推断的原因。
但是,如果您具有可以保证类型不变的作用域,则编译器可以自由使用未装箱的数据类型来存储值。那么您就没有标记数据。在局部声明变量类型的情况就是如此,对于专用数组也是如此:一旦构建了数组,其元素类型就不会随时间变化,并且在某些情况下,知道一个数组仅包含(integer 0 15)
个元素就可以了。用于更有效地打包数据。
答案 1 :(得分:3)
CLOS是在游戏后期添加到CL的(不是唯一为CL设计的对象系统)
即使使用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
。少数这种类型的不确定性与表示类型相对应-表示系统是什么东西的实际信息-但显然大多数都没有。可能有代表性类型没有相应的类型。
我认为类型实际上有三个作用。
(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系统只是通过一种更系统的方式帮助您使用方法扩展对象。