2016-10-23 2 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? 인 동일한 유형의 시퀀스를 포함합니다. 예. (eqv? (list 1 2 3) (list 1 2 3)) ; ==> #f 인 반면 (equal? (list 1 2 3) (list 1 2 3)) ; ==> #t.

#t 또는 #f을 반환하는 경우 (is-sculpture? ...)과 같으므로 (eq? (is-sculpture? ...) #t)은 필요하지 않습니다. oposite를 확인하려면 결과를 not으로 감싸므로 (not (is-sculpture? ...))이으로 표시됩니다.

cond의 두 번째 용어에서 (is-sculpture? mobile)은 사실이 아니므로 다음 행에서만 거짓 일 때 거짓인지 확인하는 이유는 무엇입니까? cond에있는 모든 용어는 동일한 cond의 이전 용어가 모두 거짓 일 것으로 기대할 수 있습니다.

우리는 코드를 실제로 눈으로 분석하지 않으므로 식별자가 얼마나 많은 괄호가 있는지 알려주고 괄호의 양은 많지 않습니다. 따라서 형식이 잘못 지정된 lisp 코드는 읽을 수 없습니다. 라켓에

당신은 내가 그것을 코드를 reident합니다 CTRL + 를 눌러야합니다. 당신은 필사적으로 그것을 필요로합니다. 또한 이전 줄 끝에 모든 끝 괄호를 넣으십시오. Heres는 I를 포맷 할 방법 :

(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 게다가 나는 로직을 변경하지 않은 내가 무엇을 인수이 다른 기능이 없거나 이후 테스트 방법이 없습니다 걸립니다.

관련 문제