1

我正在尝试编写一个函数来检查给定的输入是否包含除数字以外的任何字符。但是,我contract violation在 Scheme 下进入 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

正如 Racket 正确告诉您的那样,您正在比较 - 分支中的苹果和橙子cond,即字符与实数;string->list创建一个chars列表。您可以编写自己的谓词来克服这个问题并将其映射到一个向量上(这将是一个更实用的解决方案——您的代码看起来不像方案;))

(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 内标准化。还请考虑 lisp 系列语言的一些样式规则

于 2012-12-09T10:12:10.967 回答
2

如果您需要确定一个值是否是 and 之间的字符#\0#\9最好使用char-numeric?谓词:

(char-numeric? a-char)

从文档中:

如果 char 具有 Unicode “数字”属性,则返回 #t。

就您的代码而言,它看起来像这样:

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

我同意@LudwigMeier 的评论——你的代码看起来不像 Scheme。您正在尝试将 Scheme 当作一种类 C 语言来使用,它看起来有点奇怪。在方案中,事情已经完成......不同。

于 2012-12-09T15:41:35.793 回答