【发布时间】:2016-10-08 21:25:12
【问题描述】:
也许这个问题太笼统了,不过我会尝试: 有没有关于 common lisp 类型的综合指南?
我对这个问题有点困惑:
为什么在make-array 的:element-type 中声明的非原始类型被提升为t?是否有可能对实际声明的类型进行编译时或运行时检查?
为什么 CLOS 插槽定义的类型不能作为约束,允许将任何类型的值放入插槽?再说一遍,支票呢?
函数的类型声明与declare.. 相同。它们只是对编译器的优化提示吗?
另外,我是否可以使用自定义类型说明符,包括前面提到的位置中的 satisfies 进行一些稳健检查,或者它们只能用于通过 typep 等进行显式检查?
如您所见,我脑子里有些乱,所以非常感谢任何简洁的指南(或一组指南)。
我在 SBCL,但也很高兴了解实现之间的差异。
【问题讨论】:
-
这道题可能题太多了,有点太笼统了。但综合指南可能只是 HyperSpec 中的一部分。例如,对于类型声明,您可以查看Declaration TYPE,它准确地描述了类型声明的含义(如果变量的值实际上不是那种类型,那么您几乎有未定义的行为)。但是未定义的行为可能很有用,因为编译器可以:(i) 插入类型检查以提供安全性并让您知道是否...
-
事情出错了;或 (ii) 使用不会检查类型的优化代码,因为您保证该值将是正确的类型。它将做什么取决于其他声明,例如任何 OPTIMIZE declarations 的值。
-
HyperSpec 的另一部分可能是“综合指南”的一部分,将是章节4. Types and Classes。该部分的内容实际上有点薄,但链接到几乎所有相关条目(例如,类型在哪里使用,可以定义它们的内容,它们的使用方式等)。
-
@JoshuaTaylor 谢谢,这不是我的,但我也很喜欢。我将链接移至答案以防 cmets 被删除。
标签: types common-lisp slots clos