递归类型是一种具有基数和自身递归情况的类型。
我希望它实现“类型化列表”,即其conses仅允许相同元素类型或nil的列表。
我尝试了以下定义:
(deftype list-of (a) `(or null
(cons ,a (list-of ,a))))
然而,这表明由于编译器试图无限期地递归 list-of,因此出现了堆栈耗尽问题(至少在 SBCL 上)。是否可以定义这样的数据类型?
是的,但我作弊了;)
(defun satisfication (a)
(if a
(and (integerp (car a))
(satisfication (cdr a)))
T))
(deftype my-list () `(satisfies satisfication))
(typep (cons 1 (cons 2 (cons 3 nil))) 'my-list)
> T
(typep (cons 1 (cons 2 (cons 3.2 nil))) 'my-list)
> NIL
显然 SBCL 不喜欢递归类型 - 另一个答案很好地解释了原因。但是,如果您想坚持使用标准并仍然定义递归类型,那么隧道尽头就有一线曙光:您可以定义任何函数来检查满意度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)