Scheme 计划;mcar:违反合同;
我的问题是,每当我尝试运行这个程序时,它都会给出违反合同的错误。我知道你不能把汽车或cdr的空名单,但我正在检查它是否是空的。那么这里的问题是什么呢?考虑以下几点: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
(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