如何为同构列表定义派生类型说明符

时间:2018-07-23 17:22:17

标签: lisp common-lisp deftype

如何为同构列表定义派生类型说明符?

我想定义一个(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

那怎么办呢?

0 个答案:

没有答案