从 Racket 的子列表中删除所有 ()

Removing all ()'s from a sublist in Racket

我需要有如下程序交互:

(clean'(1 (2 () (3 () 4))()()(()) 5)) → (1 (2 (3 4)) 5) 

这是我目前所拥有的

define (emptyClear theList)
  (cond ((null? theList) '())
        ((null? (car theList)) (emptyClear (cdr theList)))
        (else (cons (car theList) (emptyClear (cdr theList))))))

(define (clean tree)
  (cond ((null? tree) '())
        ((not (list? (car tree))) (cons (car tree) (prune (cdr tree))))
        (cons (emptyClear (car tree)) (prune (cdr tree)))))

但这给了我:-> (1 5) 作为输出。

我该如何解决这个问题?

从这个例子来看,任务似乎不仅仅是从树中删除空列表,而是继续执行此操作直到可能(自'(())以来)不是一个空列表,但它仍然被删除了)。

这是一个可能的解决方案,已使用 DrRacket 进行测试。

(define (my-empty? x)
  (cond ((null? x) #t)
        ((list? x) (andmap my-empty? x))
        (else #f)))
        
(define (clean x)
  (cond ((null? x) '())
        ((not (list? x)) x)
        ((my-empty? (car x)) (clean (cdr x)))
        (else (cons (clean (car x)) (clean (cdr x))))))

(clean '(1 (2 () (3 () 4))()()((())) 5)) ;=> '(1 (2 (3 4)) 5)