我尝试编写一个函数,它获取一个由字符串表示的整数,并检查他的所有字符是否都是数字并相应地返回#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
答案 0 :(得分:2)
试试这个:
(define (checkIfStringLegal str)
(andmap char-numeric?
(string->list str)))
这是程序的工作方式:
string->list
char-numeric?
应用于每个字符#t
,则andmap
将返回#t
。如果单个验证失败,andmap
将立即返回#f
这是一个功能编程解决方案(毕竟,这个问题被标记为这样),请注意您的预期方法看起来更像是一种类似C语言的编程语言的解决方案 - 使用向量,显式循环结构({{1 }}),变异操作(do
),全局可变定义......这很好,它可能最终在一些调整之后起作用,但它不是在Scheme中做事的惯用方法,它甚至不是远程功能 - 编程解决方案。
修改强>
哎呀,我放弃了。如果你想按自己的方式编写解决方案,这将有效 - 你有一个括号问题,请注意在Scheme中缩进和关闭括号的正确方法,它将使你的代码对你和其他人更具可读性:set!
即便如此,代码可以进一步改进,我将把它作为读者的练习:
(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)))))