我想定义一个类型说明符来描述相同类型的事物列表。所以我想有(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
动态谓词?问题是satisfies
需要一个全局符号,而且我不知道如何在正确的上下文中定义谓词函数(我想我需要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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)