Scheme - 做迭代 - 返回值

时间:2012-12-16 23:36:19

标签: 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 (+ 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

1 个答案:

答案 0 :(得分:2)

试试这个:

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

这是程序的工作方式:

  1. 使用string->list
  2. 将字符串转换为字符列表
  3. 验证列表中的每个字符以查看它是否为数字,将谓词char-numeric?应用于每个字符
  4. 如果所有验证都返回#t,则andmap将返回#t。如果单个验证失败,andmap将立即返回#f
  5. 这是一个功能编程解决方案(毕竟,这个问题被标记为这样),请注意您的预期方法看起来更像是一种类似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)))))
    • 可以将这两个条件合并为一个条件
    • 退出条件应为:到达向量结尾时的循环标志为false