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

私の問題は、このプログラムを実行しようとすると契約違反エラーが発生することです。私はあなたが車やCDR空リストをすることはできませんが、私はそれが空かどうかをチェックしていることを知っています。だからここで何が問題なの?スキーム "mcar:契約違反"

答えて

1

次のことを考えてみましょう:(null? lst)はリストだけが現在空であるかどうかをチェックするため

(define lst '(1)) 

(null? lst) 
=> #f 

(cadr lst) 
=> cadr: contract violation 

あなたが見ることができるように、契約違反が発生します。しかしcadr(car (cdr lst)))を使用する場合は、(cdr lst)も空であるかどうかをチェックする必要があります。

したがって、if文で(null? ptlist)(null? (cdr ptlist))の両方をチェックする必要があります。好ましくはcondを使用します。

関連する問題