oop - 根据 CLOS(Common Lisp),类型系统的目的是什么?

标签 oop lisp common-lisp clos

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

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

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

如果这不正确,那么根据 CLOS,类型系统的实际用途是什么?谢谢。

最佳答案

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

Common Lisp 的实现必须能够确定一个值是否属于一个类型,并且以原子类型说明符开头,例如 characterinteger,然后增长带有复合类型说明符(可由用户定义)。

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

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

关于oop - 根据 CLOS(Common Lisp),类型系统的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54874535/

相关文章:

c# - 静态不可变默认实例

c# - 使用对象访问私有(private)方法

macros - Clojure - 引用困惑

Lisp语言初学者详解

string - 将 Common Lisp 中的宏参数视为(区分大小写的)字符串

c++ - "Marked as override but does not override"OOP代码问题

java - 如何在 Java 中参数化响应解析?

lisp - (dolist (element list) ...) 中的 'element' 是什么意思?

lisp - 如何在 Windows 中安装 gtk-cffi?

lisp - 是否有用于 Common Lisp 的有记录的、有组织的库集合?