计划" mcar:合同违规"

时间:2017-10-25 14:53:43

标签: scheme racket

(define (create-polygon ptlist)
  (if (null? ptlist) 0
      (append (list (make-seg (car ptlist) (cadr ptlist))) (create-polygon (cdr ptlist)))))

我的问题是每当我尝试运行此程序时,它都会给出合同违规错误。我知道你不能开车或送空列表,但我要检查它是否空了。那么这里的问题是什么?

1 个答案:

答案 0 :(得分:1)

请考虑以下事项:

(define lst '(1))

(null? lst)
=> #f

(cadr lst)
=> cadr: contract violation

如您所见,发生合同违规是因为(null? lst)仅检查列表当前是否为空。但是,如果您使用cadr (car (cdr lst)),则必须检查(cdr lst)是否为空。

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