2016-10-23 7 views
0
(define (weights# mobile) 
    (cond ((= (is-sculpture? mobile) #t) 1) 
((= (and (= (is-sculpture? mobile) #f) (= (is-sculpture? (right-mobile mobile)) #t) (= (is-sculpture? (left-mobile mobile)) #t)) #t) 3) 
(else (+ 3 (- (weights# (right-mobile mobile)) 1) (- (weights# (left-mobile mobile)) 1)))) 
) 

is-sculpture ist eine Funktion, die #t oder #f zurückgibt. Ich habe den Code gesetzt, um eine Zahl zurückzugeben, abhängig von dem Code, aber diese Nachricht erscheint auf meinem Bildschirm.Scheme excersize

> contract violation 
    expected: number? 
    given: #f 
    argument position: 1st 
    other arguments...: 

Was habe ich falsch gemacht?

Antwort

0

Nun .. Nach Ihren eigenen Text is-sculpture ist eine Funktion, die #t oder #f zurückgibt. = ist eine Funktion, die nur numerische Argumente verwendet, so soll dieser Aufruf schief gehen:

(= (is-sculpture? (right-mobile mobile)) #t) ; #t is not a number 

nun einen Wert gegen ein anderes überprüfen Sie eq? für das exakt gleiche Objekt verwenden können (#t das gleiche Objekt Symbole jedes Mal, zu), eqv? für primitive Typen. (eq? 5 5) ; ==> #f während (eqv? 5 5) ; ==> #t. equal? enthalten auch Sequenzen des gleichen Typs, bei denen alle Primitive eqv? sind. z.B. (eqv? (list 1 2 3) (list 1 2 3)) ; ==> #f während (equal? (list 1 2 3) (list 1 2 3)) ; ==> #t.

Für Dinge, die #t oder #f zurückgibt, müssen Sie nicht (eq? (is-sculpture? ...) #t), weil es das gleiche wie (is-sculpture? ...) ist. Um das Gegenteil zu überprüfen, wickeln Sie das Ergebnis einfach in not, also (not (is-sculpture? ...)) wird #t für #f Ergebnis.

In der zweiten Amtszeit in Ihrem cond Sie wissen, (is-sculpture? mobile) war nicht wahr, also warum überprüfen Sie, ob es falsch ist, wenn es nur falsch in der nächsten Zeile sein kann? Bei jedem Begriff in cond können Sie erwarten, dass alle vorherigen Begriffe in derselben cond falsch sind.

Wir analysieren Code nicht wirklich mit unseren Augen, also sagt die Identifikation uns, wie viele parens dort sind und nicht die tatsächliche Menge von parens. Daher ist schlecht formatierter Lispcode nicht lesbar.

In Schläger müssen Sie CTRL +ich es Ihr Code reident drücken. Du brauchst es dringend. Setze auch alle Endparens am Ende der vorherigen Zeile. Heres, wie ich es formatiert werden:

(define (weights# mobile) 
    (cond ((is-sculpture? mobile) 
     1) 
     ; (is-sculpture? mobile) is #f 
     ((and (is-sculpture? (right-mobile mobile)) 
       (is-sculpture? (left-mobile mobile))) 
     3) 
     ; At least one of the other is-sculpture? expressions are false. 
     (else 
     (+ 1 ; 3 + x-1 + y-2 == 1+x+y 
      (weights# (right-mobile mobile)) 
      (weights# (left-mobile mobile)))))) 

Neben removnig alle = Tests, die reduncant sind habe ich nicht die Logik geändert und ich habe keine Möglichkeit der Prüfung, da ich Ihre anderen Funktionen nicht oder welche Argumente diese dauert.