Scheme 计划;mcar:违反合同;

Scheme 计划;mcar:违反合同;,scheme,racket,Scheme,Racket,我的问题是,每当我尝试运行这个程序时,它都会给出违反合同的错误。我知道你不能把汽车或cdr的空名单,但我正在检查它是否是空的。那么这里的问题是什么呢?考虑以下几点: (define (create-polygon ptlist) (if (null? ptlist) 0 (append (list (make-seg (car ptlist) (cadr ptlist))) (create-polygon (cdr ptlist))))) 如您所见,发生合同冲突是因为(null

我的问题是,每当我尝试运行这个程序时,它都会给出违反合同的错误。我知道你不能把汽车或cdr的空名单,但我正在检查它是否是空的。那么这里的问题是什么呢?

考虑以下几点:

(define (create-polygon ptlist)
  (if (null? ptlist) 0
      (append (list (make-seg (car ptlist) (cadr ptlist))) (create-polygon (cdr ptlist)))))
如您所见,发生合同冲突是因为
(null?lst)
仅检查列表当前是否为空。但是如果您使用
cadr
,即
(car(cdr-lst))
,则必须检查
(cdr-lst)
是否也为空

因此,if语句需要同时检查
(null?ptlist)
(null?(cdr ptlist))
,最好使用
cond

(define lst '(1))

(null? lst)
=> #f

(cadr lst)
=> cadr: contract violation