Эй, метод, известный как древовидная рекурсия, полезен для такого типа проблем.
Я согласен с общей структурой ответа Грега, но я думаю, что мы должны явно фильтровать атомарные (не списочные) значения из вложенных списков.
(define (rem-atoms lst)
(cond
((not (list? lst)) lst)
((null? lst) (list))
(else
(filter
(lambda (a) (list? a))
(cons (rem-atoms (car lst))
(rem-atoms (cdr lst)))))))
(rem-atoms '(f (x y) z () (k ()))) ; --> (() () (()))
(rem-atoms '(f x (y))) ; --> (())
После дальнейшей проверки крошечная поправка к хорошему решению Грега также теперь дает правильные результаты. В частности: (не (список? Хх)), а не (нет (пара? Хх)).
(define (rem-atoms lat)
(cond
((null? lat) lat)
((not (list? (car lat))) (rem-atoms (cdr lat)))
(else
(cons (rem-atoms (car lat))
(rem-atoms (cdr lat)))))))
(rem-atoms '(f (x y) z () (k ()))) ; --> (() () (()))
(rem-atoms '(f x (y))) ; --> (())
Хм. Я думаю, что мне больше нравится эта вторая версия!
Обратите внимание, я здесь новенький, но я надеюсь, что это поможет.