2012-12-16 40 views
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的字符在i的地方。

其运行正常,但是当我尝试使用本功能,像(checkIfStringLegal "444")我得到 -

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

回答

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
  • 退出条件应该是:达到向量结尾时结束循环国旗是假的
+0

这将工作在整数,但我也有其他要求检查这个数字。那么我怎样才能用我自己的代码解决它? – URL87

+1

@ URL87拥抱函数式编程! “在罗马的时候...”。只需调整谓词,直到满足您的要求。例如,如果你必须测试它是一个数字还是一个小数点,可以用这个代替'char-numeric?':'(lambda(c)(或者(char-numeric?c)(char =?c# \')))' –

+0

我试着用'(checkIfStringLegal“444”)来提示你的第一个建议,但是它提示'andmap:undefined; 不能引用未定义的标识符' – URL87