1

指定された入力に数字以外の文字が含まれているかどうかをチェックする関数を作成しようとしています。ただし、contract violationSchemeの下でDrRacketにアクセスします。

コードは次のとおりです。

文字列を文字に分割する方法:

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

どうしたの ?

4

2 に答える 2

2

ラケットが正しく言っているように、あなたはあなたの枝のリンゴとオレンジcond、すなわち文字と実数を比較しています。文字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-mapR6RS内で標準化されています。lispファミリーの言語のいくつかのスタイルルールも考慮してください。

于 2012-12-09T10:12:10.967 に答える
2

値がとの間の文字であるかどうかを判別する必要がある場合は#\0、述語#\9を使用することをお勧めします。char-numeric?

(char-numeric? a-char)

ドキュメントから:

charにUnicodeの「Numeric」プロパティがある場合は#tを返します。

コードの場合、次のようになります。

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

@LudwigMeierのコメントに同意します-あなたのコードはSchemeのようには見えません。あなたはSchemeをCのような言語であるかのように使おうとしていますが、少し奇妙に見えます。スキームでは、物事は...異なります。

于 2012-12-09T15:41:35.793 に答える