首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用Lisp调用deftype方法

通用Lisp调用deftype方法
EN

Stack Overflow用户
提问于 2020-11-01 01:13:35
回答 1查看 103关注 0票数 1

我不能让这件事继续下去。我正在使用deftype SameType(x y)方法定义一个谓词,该方法评估列表x和列表y的元素是否具有相同的类型,以及是否处于相同的位置。当我尝试调用谓词进行测试时,问题就出现了。我收到一个错误ERROR: SameType is undefined,这是我的代码:

代码语言:javascript
复制
(deftype SameType (x y)
`(cond 
    ((and (null x) (null y) T))
    (
        (and (numberp (car x)) (numberp (car y)))
        (SameType (cdr x) (cdr y) )
    )
    (
        (and (stringp (car x)) (stringp (car y)))
        (SameType (cdr x) (cdr y) )
    )
    (
        (and (atom (car x)) (atom (car y)))
        (SameType (cdr x) (cdr y) )
    )
    (T nil)
)

)

我是这么称呼它的

代码语言:javascript
复制
(SameType '(A B C 1 2 4 A) '('() G 2 5 6 A B))

我已经在这个网站上查看了各种在线资源,甚至相关的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-01 02:03:19

deftype可用于定义类型,而不是谓词。例如,要定义仅包含整数的列表类型,可以编写如下代码:

代码语言:javascript
复制
(defun intlistp (l)
  "predicate to check if l is a list consisting only of integers"
  (and (listp l)               ; l is a list and
       (every #'integerp l)))  ; every element of l is an integer

(deftype integer-list ()
  "the type of list of integers"
  `(satisfies intlistp))

然后,您可以检查某个值是否满足此类型:

代码语言:javascript
复制
CL-USER> (typep '(1 2 3) 'integer-list)
T
CL-USER> (typep '(1 2.5 3) 'integer-list)
NIL

如果您想根据您的定义检查两个列表是否具有相同的类型,那么您可以定义一个常规函数:

代码语言:javascript
复制
(defun same-type (l1 l2)
  "check if lists l1 and l2 have the same length and corresponding
   elements of the same CL type"
  (cond ((null l1)        ; if l1 is null
         (null l2))       ; returns true only if also l2 is null
        ((and (consp l1)  ; if l1 is a cons
              (consp l2)  ; and l2 is a cons too,
              (typep (car l1) (type-of (car l2)))) ; and their cars have the same CL type
         (same-type (cdr l1) (cdr l2))))) ; go recursively on their cdrs

CL-USER> (same-type '(1 a 3) '(2 b 4))
T
CL-USER> (same-type '(1 "a" 3) '(2 "b" 3))
T
CL-USER> (same-type '(1 a 3) '(2 b 4.5))
NIL
CL-USER> (same-type '(1 a 3) '(2 b 4 3))
NIL
CL-USER> (same-type '(1 2 (3 4)) '(1 6 (4 5)))
T
CL-USER> (same-type '(1 2 (3 4)) '(1 6 (4 5 6)))
T

请注意,正如您从上一个示例中看到的,类型仅针对列表的第一级进行检查。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64624444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档