2012-12-09 29 views
1

我想寫一個函數,檢查給定的輸入是否包含數字以外的任何字符。但是,我在DrRacket的計劃下獲得contract violation迭代計劃向量的元素導致違反合同

下面的代碼:

的方法,其分離的字符串變換成字符:

(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

如果您需要確定一個值是#\0#\9之間的角色,更好地運用char-numeric?斷言:

(char-numeric? a-char) 

從文檔:

返回#T如果char的Unicode「數字」屬性。

在你的代碼的情況下,它看起來像這樣:

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

我@ LudwigMeier的評論表示贊同 - 你的代碼看起來並不計劃,等等。你試圖使用Scheme,就好像它是一種C語言,它看起來有點奇怪。在計劃中,事情完成...不同。

+1

感謝提示'char-numeric?'! :) – 2012-12-09 15:51:42

+0

@ÓscarLópez:如果我運行'(定義myNumber(打破「dsdsadsa」))'然後我得到'char-numeric ?:違反合同 預期:char? 給出:1' – ron

+0

@ÓscarLópez:好的,你贏了:)你的建議很好! +1和選擇! – ron

2

正如Racket告訴你的,你正在比較你的cond分支中的蘋果和橘子,即chars和reals; 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。請爲lisp家族的語言考慮一些style-rules

+1

別忘了'#\ 0'字符;) –

+0

你是對的。我已經修復了代碼。 :))) – 2012-12-09 16:29:58