代码之家  ›  专栏  ›  技术社区  ›  J S

在公共Lisp中,如何定义一个通用的数据类型说明符(如整数列表)?

  •  10
  • J S  · 技术社区  · 16 年前

    (list-of integer) 类似 (array integer) (内置)。我可以为特定类型创建它,例如:

    (defun elements-are-integer (seq) 
      (every #'(lambda (x) (typep x 'integer)) seq))
    (deftype list-of-integer ()
      '(and list (satisfies elements-are-integer)))
    

    但是,这意味着我必须对每种可能的类型都这样做。如何更改此代码以使该类型将另一个类型作为参数,并构造 satisfies 满足 需要一个全局符号,但我不知道如何在适当的上下文中定义谓词函数(我想我需要 gensym 不知怎么回事,但怎么回事。另外,该解决方案应该能够工作,以便可以在另一个包中创建该类型。

    2 回复  |  直到 16 年前
        1
  •  14
  •   WReach    15 年前

    试试这个:

    (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