(define (create-polygon ptlist)
(if (null? ptlist) 0
(append (list (make-seg (car ptlist) (cadr ptlist))) (create-polygon (cdr ptlist)))))
我的问题是每当我尝试运行此程序时,它都会给出合同违规错误。我知道你不能开车或送空列表,但我要检查它是否空了。那么这里的问题是什么?
答案 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
。