据我了解,Common Lisp 对象的内存布局(按位标记由 CLOS(类)定义)。
我理解每个类都有对应的类型,但不是每个类型都有对应的类,因为类型可以是复合的(列表)。我认为类型就像逻辑约束,而不是带有标记方案的具体“类型”的类。
如果这是正确的,那么类型系统除了作为逻辑约束(例如指定整数必须在特定范围内,或者数组包含特定类型)之外还有其他用途吗?
如果这不正确,那么根据 CLOS,类型系统的实际用途是什么?谢谢。
最佳答案
一个对象一次只有一个类,而它可以满足多种类型。
类型系统是一个格子,您可以在其中计算两种类型的最小上限和最大下限(分别使用 or
、and
),并且允许顶部类型(T)和底部类型(NIL类型,与NULL类型不同)。
Common Lisp 的实现必须能够确定一个值是否属于一个类型,并且以原子类型说明符开头,例如 character
或 integer
,然后增长带有复合类型说明符(可由用户定义)。
但是这是使用标签还是通过静态分析来完成,留给实现;实际上,CL 在某些情况下无法精确地静态确定对象的类型(T 除外),这仅仅是因为可以在以后重新定义对象:您不能假定其类型是固定的(例如:a函数;这就是内联或全局声明可能有助于类型推断的原因)。
但是如果你有一个类型可以保证不变的范围,编译器可以自由地使用未装箱的数据类型来存储值。那么你没有标记数据。变量类型的局部声明就是这种情况,对于专门的数组也是如此:一旦构建了一个数组,其元素类型就不会随时间改变,并且在某些情况下知道数组仅包含 (integer 0 15)
元素可用于更有效地打包数据。
关于oop - 根据 CLOS(Common Lisp),类型系统的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54874535/