创建Racket错误消息

时间:2015-03-29 23:38:43

标签: scheme racket

我很难创建应该是递归函数的简单错误消息。我有这个程序:

(check-expect (rewrite '(x x x - x x x x) 3 'x)
       (list 'x 'x 'x 'x 'x 'x 'x 'x))
(check-error (rewrite '(5 4 3 2 1) 5 6) 
         "rewrite: 5 is too large for (5 4 3 2 1)")

(define (rewrite init-ls init-n init-val)
  (local [(define (help ls n val)
            (cond 
              [(zero? n) (cons val (rest ls))]
              [(empty? ls) (error 'rewrite 
                                       (format "~s is too large for ~s"
                                                init-n init-ls))]      
              [else (cons (first ls) 
                          (rewrite (rest ls) (sub1 n) val))]))]
        (help init-ls init-n init-val) ))

基本上它只是用你选择的val(值)替换列表位置n的元素。当n大于列表的长度时,我无法得到错误消息。

*我不想使用(长度列表),因为当你开始在列表中放入大量项目时,这显然会很慢

我尝试过不使用本地函数,将它置于(零?)之上,并且在本地函数之外有多种方式,但却无法使其工作。在ISL +

中,任何帮助都会很棒

1 个答案:

答案 0 :(得分:2)

这里有两个小问题。第一个是检查zero?empty?的条款应该颠倒过来,因为zero?案例假设非空列表。

更重要的问题可能只是一个错字。当您再次出现时,请致电rewrite,而不是help

[else (cons (first ls) 
            (rewrite (rest ls) (sub1 n) val))]

您应该拨打help,这将保留init-lsinit-n的值,以便在您的错误消息中使用。

固定代码如下所示:

(define (rewrite init-ls init-n init-val)
  (local [(define (help ls n val)
            (cond
              [(empty? ls) (error 'rewrite
                                  (format "~s is too large for ~s"
                                          init-n init-ls))]
              [(zero? n) (cons val (rest ls))]
              [else (cons (first ls)
                          (help (rest ls) (sub1 n) val))]))]
    (help init-ls init-n init-val)))