2017-10-25 3 views
1
(define (create-polygon ptlist) 
    (if (null? ptlist) 0 
     (append (list (make-seg (car ptlist) (cadr ptlist))) (create-polygon (cdr ptlist))))) 

Mein Problem ist, wenn ich versuche, dieses Programm auszuführen gibt es einen Vertragsverletzungsfehler. Ich weiß, dass Sie keine leeren Listen oder leere Listen können, aber ich überprüfe, ob es leer ist oder nicht. Also, was ist das Problem hier?Schema "mcar: Vertragsverletzung"

Antwort

1

Beachten Sie Folgendes:

(define lst '(1)) 

(null? lst) 
=> #f 

(cadr lst) 
=> cadr: contract violation 

Wie Sie die Vertragsverletzung tritt auf, weil (null? lst) prüft nur sehen können, ob die Liste derzeit leer. Aber wenn Sie cadr verwenden, was (car (cdr lst)) ist, dann müssen Sie überprüfen, ob (cdr lst) auch leer ist.

Ihre if-Anweisung muss also sowohl (null? ptlist) als auch (null? (cdr ptlist)) überprüfen, vorzugsweise cond.

Verwandte Themen