删除列表Scheme中的第二个项目

时间:2018-10-05 12:26:54

标签: list scheme racket

我的程序可以处理所有列表,但不正确的列表除外(不正确的列表(在最后一个 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)))))))

1 个答案:

答案 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)))))))