Common lisp 在CommonLisp中,如何定义通用数据类型说明符(如整数列表)?

Common lisp 在CommonLisp中,如何定义通用数据类型说明符(如整数列表)?,common-lisp,Common Lisp,我想定义一个类型说明符来描述相同类型的事物列表。因此,我想让(整数列表)类似于(数组整数)(内置)。我可以为特定类型创建它,如下所示: (defun elements-are-integer (seq) (every #'(lambda (x) (typep x 'integer)) seq)) (deftype list-of-integer () '(and list (satisfies elements-are-integer))) 然而,这意味着我必须对每种可能的类型都这样

我想定义一个类型说明符来描述相同类型的事物列表。因此,我想让
(整数列表)
类似于
(数组整数)
(内置)。我可以为特定类型创建它,如下所示:

(defun elements-are-integer (seq) 
  (every #'(lambda (x) (typep x 'integer)) seq))
(deftype list-of-integer ()
  '(and list (satisfies elements-are-integer)))
然而,这意味着我必须对每种可能的类型都这样做。如何更改此代码,使该类型将另一个类型作为参数,并动态构造
满足
谓词?问题是
满足了
需要一个全局符号,我不知道如何在适当的上下文中定义谓词函数(我想我需要
gensym
以某种方式定义它,但是如何定义?)。此外,该解决方案应该能够在另一个包中创建类型。

尝试以下操作:

(defun elements-are-of-type (seq type)
  (every #'(lambda (x) (typep x type)) seq))

(deftype list-of-type (type)
  (let ((predicate (gensym)))
    (setf (symbol-function predicate)
      #'(lambda (seq) (elements-are-of-type seq type)) )
    `(and list (satisfies ,predicate)) ))

(typep '(1 2 3) '(list-of-type integer))
; -> T

(typep '(1 2 a) '(list-of-type integer))
; -> NIL

(typep '(a b c) '(list-of-type symbol))
; -> T