2016-10-23 1 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

#t又は#fを返す関数です。コードに応じて数値を返すようにコードを設定しましたが、このメッセージは自分の画面に表示されます。スキームexcersize

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

どうしたのですか?

答えて

0

まあ..独自のテキストによるとis-sculpture#tまたは#fを返す関数です。 =は数字のみの引数をとる関数である。したがって、この呼び出しが間違って行く必要があります。今

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

あなたがまったく同じオブジェクト(#tは毎回同じオブジェクトである、シンボルにeq?を使用することができます別に対して一つの値をチェックしますあまりにも)、eqv?プリミティブ型の場合(eq? 5 5) ; ==> #f(eqv? 5 5) ; ==> #tです。 equal?はまた、全てのプリミティブがeqv?である同じタイプのシーケンスを含む。例えば。 (equal? (list 1 2 3) (list 1 2 3)) ; ==> #t(eqv? (list 1 2 3) (list 1 2 3)) ; ==> #f

#tまたは#fを返すものについては、(is-sculpture? ...)と同じであるため、(eq? (is-sculpture? ...) #t)は不要です。あなたはちょうどnotの結果をラップするので、(not (is-sculpture? ...))は、の結果では#tになります。

condの2番目の単語には、(is-sculpture? mobile)が真ではないことがわかっています。なぜ、次の行で偽である可能性がある場合は、どうして偽であるかチェックしますか? condのすべての用語は、同じcondの以前のすべての用語が偽であると期待できます。

私たちは目でコードを実際に解析していないので、実際に括約筋がいくつあるかを示しています。したがって、ひどくフォーマットされたlispコードは読めません。ラケットで

は、私はそれはあなたのコードをreidentます CTRL + を押す必要があります。あなたは必死にそれを必要とします。また、前の行の最後にすべての終わりの括弧を入れてください。私はそれをフォーマットする方法をHERESに:

(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)))))) 

reduncantあるすべて=テストをremovnigのほかに、私はロジックを変更していないと私はあなたの他の機能を持っているか、どのような引数は、このしていないので、私は、テストの方法がありません取る。