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
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时结束循环
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)))))