gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:41:15 24 4
gpt4 key购买 nike

我想定义一个类型说明符,该说明符描述相同类型的事物的列表。所以我想拥有类似于(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

关于common-lisp - 在Common Lisp中,如何定义通用数据类型说明符(如整数列表)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3210177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com