Удаление элемента из списка в схеме оставляет пустой элемент нулевого списка

У меня есть следующий код:

 (define (atom? x)
   (and (not (null? x))
   (not (pair? x)))) 


 (define delete 
   (lambda (atom l)
     (cond
       ((null? l) '())
       ((atom? l) 
        (cond 
          ((not(eq? atom l)) l)
          (else '())
        )
       ) 
       (else (cons (delete atom (car l)) (delete atom (cdr l))) )
     )
   )  
  ) 

Цель состоит в том, чтобы удалить определенного персонажа из этого списка. Например,

 (delete 'a '(a b a) )  ==> (b)

Вместо этого я получаю:

  (delete 'a '(a b a) )==> (() b ())

Я новичок в схеме. Я пытался ничего не возвращать, если значение найдено, однако это просто заставляет его вести себя так:

 (delete 'a '(a b a) )==> (#<void> b #<void>)

Есть идеи? Большое спасибо!

1 ответ

Решение
 (define delete
      (lambda (atom l)
           (cond
                ((null? l) '())
                ((atom? (car l))
                     (cond
                          ((eq? atom (car l)) (delete atom (cdr l)))
                          (else (cons (car l) (delete atom (cdr l))))

                     )
                )
                (else (cons (delete atom (car l)) (delete atom (cdr l))))
            )
      )
  )  

Это решение является более простым и более простым для понимания из основ.

Другие вопросы по тегам