2012-02-20 3 views
3
(define (even-odd x) 
(if (==(% x 2) 0) (1) (0))) 

내가 전화 (짝수 홀수 5) 내가이 메시지Scheme에서 언 바운드 변수 오류가 발생하는 이유는 무엇입니까? 디버거를 시작,

;Unbound variable: % 
;To continue, call RESTART with an option number: 
; (RESTART 11) => Specify a value to use instead of %. 
; (RESTART 10) => Define % to a given value. 
; (RESTART 9) => Return to read-eval-print level 9. 
; (RESTART 8) => Return to read-eval-print level 8. 
; (RESTART 7) => Return to read-eval-print level 7. 
; (RESTART 6) => Return to read-eval-print level 6. 
; (RESTART 5) => Return to read-eval-print level 5. 
; (RESTART 4) => Return to read-eval-print level 4. 
; (RESTART 3) => Return to read-eval-print level 3. 
; (RESTART 2) => Return to read-eval-print level 2. 
; (RESTART 1) => Return to read-eval-print level 1. 

거야? (y 또는 n) :

내가 잘못 했습니까? 또한 edwin에서 텍스트를 선택하는 방법을 알려주십시오.

+0

문제는 '=='와 '%'는 모든 언어에서 동일 보편적 인 의미를 가지고 있다고 가정합니다 414,심지어 더 나은, 내장 프로 시저 even?를 사용합니다. 하지만 그렇지 않습니다. – dyoo

답변

4

여기에 몇 가지 문제가 있습니다. 즉 당신이 전화하려고하는 절차의 이름에 착각 한 것입니다.

  • % 당신은 단순히 숫자인지를 말하려고하는 경우 modulo
  • ==이 zvrba가 언급 한 바와 같이, eqv?
  • 일 0

1을 둘러싼 괄호를 제거하거나해야해야 짝수 또는 홀수의 경우 간단하고 깨끗한 방법은 내장 even?을 사용하는 것입니다.

(even? 5) 
> #f 

또는 당신이 실제로 결과로 0과 1을 원한다면, 깨끗한 표현이이 even-odd 절차를 작성하는 더 관용적 방법입니다

(if (even? x) 1 0) 
3

반환 값 (1과 0)을 중심으로 괄호를 생략해야합니다. 당신이 쓴 것은 1과 0이라는 프로 시저를 호출하려고 시도합니다. 또한 모듈러스 연산자는 %이 아니지만 그렇지 않은 경우 [매뉴얼을 확인하십시오. 나는 그것을 잊어 버렸다 - 아마 mod 또는 rem].

+0

paranthesis를 제거한 후에도 여전히 동일한 오류가 발생합니다. –

+1

모듈러스 연산자가 '모듈'입니다. 또한'=='연산자가 아닙니다 - 당신은'eq? '를 사용하고 싶습니다 – dagoof

+0

@ dagoof thanks .. 또한'== '를'= ' –

3

수 :

(define (even-odd x) 
    (if (zero? (modulo x 2)) 
     #t 
     #f)) 

을 조금 더 짧음 :

(define (even-odd x) 
    (zero? (modulo x 2))) 
(even? x) 
관련 문제