如何为同构列表定义派生类型说明符?
我想定义一个(list-of T)
类型,该类型只能由仅包含T
类型的元素的列表来满足。
我想这样做是因为它使理解数据结构变得更加容易。例如,如果我有:
(defstruct foo
(items nil :type list))
这几乎没有告诉我有关此数据结构的任何有用信息。当然,items
是一个列表,但是列表是什么?这样更好:
(defstruct foo
(items nil :type (list-of integer)))
我的第一次尝试是
(defun homogeneous (list type)
(every (lambda (x) (typep x type))
list))
(deftype list-of (type)
`(and list
(satisfies (homogeneous ,type))))
(typep '(1 2 3) '(list-of integer))
但是SBCL给我这个错误:
The SATISFIES predicate name is not a symbol: (HOMOGENEOUS INTEGER)
我不希望它起作用,因为the hyperspec specifies satisfies
to be:
类型说明符 满意
复合类型说明符类型:
谓词。
复合类型说明符语法:
满意 谓词名称
化合物类型说明符参数:
谓词名称 --- symbol。
那怎么办呢?