1

我试图编写一个函数,它获取一个整数,由字符串表示,并检查他的所有字符是否都是数字并相应地返回#t\ #f。那是代码 -

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

(define myVector 0)
(define flag #t)

(define (checkIfStringLegal str) (
(set! myVector (splitString str))
(do (  (i 0 (+ i 1))  )  ; init
  ((= i (vector-length myVector)) flag) ; stop condition
  (cond ((>= 48 (char->integer (vector-ref myVector i)) ) (set! flag #f))
        ((<= 57 (char->integer (vector-ref myVector i)) )(set! flag #f))


  )    
)
) 
) 

几个解释——

(list->vector (string->list str))- 将字符列表转换为字符串。

(vector-ref myVector i)myVector- 来自at 位置的字符i

它运行正常,但是当我尝试使用这个函数时,就像(checkIfStringLegal "444")我得到 -

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #<void>
  arguments...:
   #t
4

1 回答 1

2

尝试这个:

(define (checkIfStringLegal str)
  (andmap char-numeric?
          (string->list str)))

这是该程序的工作方式:

  1. 它将字符串转换为字符列表,使用string->list
  2. 它验证列表中的每个字符以查看它是否是数字,并将谓词char-numeric?应用于每个字符
  3. 如果返回所有验证#tandmap将返回#t。如果单个验证失败,andmap#f立即返回

这是一个函数式编程解决方案(毕竟,这个问题是这样标记的),请注意,您的预期方法看起来更像是类 C 编程语言中的解决方案 - 使用向量、显式循环构造 ( do)、变异操作 ( set!) ,全局可变定义......这很好,经过一些调整后它最终可能会工作,但这不是在 Scheme 中做事的惯用方式,它甚至不是一个远程函数式编程解决方案。

编辑:

哎呀,我放弃了。如果您想以自己的方式编写解决方案,这将起作用 - 您遇到了括号问题,请注意在 Scheme 中缩进和关闭括号的正确方法,这将使您的代码对您和其他人更具可读性:

(define (splitString str) (list->vector (string->list str)))
(define myVector 0)
(define flag #t)

(define (checkIfStringLegal str)
  (set! myVector (splitString str))
  (do ((i 0 (+ i 1)))
    ((= i (vector-length myVector)) flag)
    (cond ((>= 48 (char->integer (vector-ref myVector i)))
           (set! flag #f))
          ((<= 57 (char->integer (vector-ref myVector i)))
           (set! flag #f)))))

即便如此,代码还可以进一步改进,我将把它作为练习留给读者:

  • 这两个条件都可以折叠成一个条件,使用or
  • 退出条件应该是:到达向量末尾或标志为假时结束循环
于 2012-12-16T23:39:43.533 回答