2012-12-09 3 views
1

주어진 입력에 숫자 이외의 문자가 들어 있는지 확인하는 함수를 작성하려고합니다. 그러나 Scheme의 DrRacket에 contract violation이 있습니다. 여기 Scheme-vector 요소를 반복하면 계약 위반이 발생합니다.

코드입니다 :

방법이 문자로 문자열 분리 :

(define (breaking str) (list->vector (string->list str))) 

수에 대한 벡터 만들기 : 여기

(define myNumber (breaking "123498765")) 

내가 주어진 번호를 확인 :

(define (vectorFunc myVector) 
(define i 0)      
(do()        
    ((= i (vector-length myVector))) ; run until the end of the vector 
    (cond ((< (vector-ref myVector i) #\0) 'incorrect) 
     ((> (vector-ref myVector i) #\9) 'also-incorrect)) 
    (set! i (+ i 1)) ; inc "i+ by 1 
); end of do 
) 
그리고 (vectorFunc myNumber)의 출력은

:

. . >: contract violation 
    expected: real? 
    given: #\1 
    argument position: 1st 
    other arguments...: 
    #\0 
> 

그 문제점은 무엇입니까?

답변

2

, 더 char-numeric? 술어를 사용

반환 값이 문자가있는 경우 #T 유니 코드 "숫자"속성. 코드의 경우

, 그것은 다음과 같습니다

(cond ((not (char-numeric? (vector-ref myVector i))) 
     'incorrect) 
     (else ...)) 

나는 @ LudwigMeier의 의견에 동의 - 코드가 계획처럼 보이지 않는다. Scheme을 마치 C와 비슷한 언어처럼 사용하려고하고 있는데, 조금 이상해 보입니다. Scheme에서 일은 끝났어 ... 다르다.

+1

'char-numeric?'에 대한 힌트를 주셔서 감사합니다! :) –

+0

@ Óscar López :'(myNumber (breaking "dsdsadsa"))'를 실행하면 'char-numeric?'이 표시됩니다. 계약 위반 expected : char? given : 1' – ron

+0

@ Óscar López : 알았어요. :) 당신의 제안은 훌륭합니다! +1하고 선택한! – ron

2

라켓이 올바르게 알려주기 때문에 cond-branch의 사과와 오렌지를 비교합니다. 즉, 문자가 실제와 비교됩니다. string->list글자의 목록을 만듭니다. 당신은이 문제를 극복하고 벡터를 통해 매핑하기 위해 자신의 술어 쓸 수 (더 기능적인 해결책이 될 것이다을 - 당신의 코드는 매우 체계와 같은 보이지 않는))

(define (breaking str) 
    (list->vector (string->list str))) 

(define my-number 
    (breaking "1234987650")) 

(define (represents-char-number? char) 
    (if (member char '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9)) 
     #t 
     #f)) 

(define (vector-func vec) 
    (vector-map represents-char-number? vec)) 

(vector-func my-number) 
===> #(#t #t #t #t #t #t #t #t #t #t) 

vector-map은 R6RS 내 standartized된다. 리스프 패밀리의 언어에 대해서는 style-rules도 고려하십시오. 문서에서

(char-numeric? a-char) 

: 당신이 값이 #\0#\9 사이에 문자가 있는지 확인해야하는 경우

+1

'# \ 0' char;을 잊지 마세요. –

+0

맞습니다. 코드를 수정했습니다. :))) –

관련 문제