我的程序可以处理所有列表,但不正确的列表除外(不正确的列表(在最后一个 cons 单元格的cdr
字段中有一个原子)。请帮助升级此程序以使用不正确的列表:
(define (ndelete lst)
(let recur ((i 1) (rest lst))
(cond ((null? rest) '())
((= i 2) (recur 1 (cdr rest)))
(else (cons (car rest) (recur (+ i 1) (cdr rest)))))))
答案 0 :(得分:1)
您只需要修复基本条件(null? rest)
。如果要支持不正确的列表,则应检查(not (pair? rest))
。
当然,这会使您的函数处理任何对象(而不仅仅是列表)具有令人讨厌的副作用。对于任何非列表对象,它仅返回nil。如果这对您来说是个问题,则需要封装递归函数,并确保lst
实际上是列表。像这样:
(define (ndelete lst)
(letrec ((recur (lambda (i rest)
(cond ((not (pair? rest)) '())
((= i 2) (recur 1 (cdr rest)))
(else (cons (car rest) (recur (+ i 1) (cdr rest))))))))
(if (pair? lst)
(recur 1 lst)
(raise (condition (make-error)
(make-message-condition `(,lst is not a pair)))))))