因此,我想为列表编写一个类型说明符,以允许指定列表元素的类型。像这样:
(deftype list-of (v) (cons ,v (or null (list-of ,v))))
但是,那当然行不通,因为众所周知,不支持递归类型。当然,可以映射类似“满足条件”的内容(如此处提到的Is it possible to define a recursive type in Common Lisp?),但是这种方式否定了适用于语言分析和脱机代码分析的干净递归定义的优势。 (例如,证明代码正确,或在各种语言之间进行翻译)。
有什么建议吗?似乎这是标准的缺失,除非我缺少明显的东西,考虑到我们通常使用列表来表示集合-为什么没有一种简单的方法来声明set元素的类型?
答案 0 :(得分:2)
对不起,这是不允许的。 DEFTYPE
规范说:
由于必须终止扩展而返回的类型说明符的递归扩展,包括嵌套在扩展中的类型说明符的扩展。
该语言是标准化过程中RECURSIVE-DEFTYPE清理问题的结果。在某些情况下,实现可以允许递归类型定义作为扩展,但是您不能移植依赖它。