我很难创建应该是递归函数的简单错误消息。我有这个程序:
(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 +
中,任何帮助都会很棒答案 0 :(得分:2)
这里有两个小问题。第一个是检查zero?
和empty?
的条款应该颠倒过来,因为zero?
案例假设非空列表。
更重要的问题可能只是一个错字。当您再次出现时,请致电rewrite
,而不是help
:
[else (cons (first ls)
(rewrite (rest ls) (sub1 n) val))]
您应该拨打help
,这将保留init-ls
和init-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)))