Functional programming Scheme-do迭代返回值

Functional programming Scheme-do迭代返回值,functional-programming,scheme,iteration,Functional Programming,Scheme,Iteration,我试图编写一个函数,它获取一个整数,用字符串表示,并检查他的所有字符是否都是数字,然后相应地返回\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 (+

我试图编写一个函数,它获取一个整数,用字符串表示,并检查他的所有字符是否都是数字,然后相应地返回
\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))


  )    
)
) 
) 
试试这个:

(define (checkIfStringLegal str)
  (andmap char-numeric?
          (string->list str)))
这是程序的工作原理:

  • 它使用
    string->list
  • 它验证列表中的每个字符是否为数字,并对每个字符应用谓词
    char numeric?
  • 如果所有验证返回
    #t
    和map
    将返回
    #t
    。如果单个验证失败,
    和map
    将立即返回
    #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)))))
    
    (定义(拆分字符串str)(列表->向量(字符串->列表str)))
    (定义myVector 0)
    (定义标志#t)
    (定义(checkIfStringLegal str)
    (set!myVector(splitString str))
    (do((i0(+i1)))
    ((=i(向量长度myVector))标志)
    (cond((>=48(字符->整数(向量参考myVector i)))
    (设置!标志#f))
    ((整数(向量参考myVector i)))
    (集!旗#f(#()())))
    
    尽管如此,代码还可以进一步改进,我将把它作为练习留给读者:

    • 使用
    • 退出条件应该是:当到达向量的末尾或标志为false时结束循环

    这对integer有效,但我还有其他要求来检查这个数字。那么,我如何用自己的代码解决它呢?@URL87拥抱函数式编程!“在罗马的时候……”。只要调整谓词,直到它满足您的要求。例如,如果你必须测试它是一个数字还是一个小数点,用它来代替
    char numeric?
    (lambda(c)(或(char numeric?c)(char=?c#\))
    我用
    (checkIfStringLegal“444”)
    尝试了你的第一个建议,但它提示
    和map:undefined;无法引用未定义的标识符
    @URL87,这意味着您的解释器没有
    和map
    过程。在这里,使用这个:
    (define(andmap pred lst)(cond((null?lst)#t)(not(not(pred(car lst)))#f)(else(andmap pred(cdr lst))))
    @URL87请注意,“real”的行为有点不同,但我的简短实现可以满足您的需要。
    (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)))))