使用 lambda 在 Racket 中删除深层列表

deep list remove in Racket with lambda

我需要创建一个接受 2 个输入的过程。第一个是测试程序,第二个是列表。

作为输出,它生成一个列表,该列表是输入列表的副本,其中包含 测试程序评估为 true 的删除。

注意输入列表可以是深列表。

例如

(deep-list-remove (lambda (x) (= x 0)) (list 0 1 2 3))
;returns (1 2 3)

(deep-list-remove (lambda (x) (< x 4)) '(7 2 (3 4 (5 6))))
;returns '(7 ( 4 (5 6)))

我试过

(define (deep-list-remove f list)
  (for/list ([i list]
             #:unless (f (f i))))
             i             
  )
)

enter image description here

但我收到以下错误

=: contract violation expected: number? given: #t

提前感谢您的帮助

这是一个使用递归函数的解决方案:

(define (deep-list-remove f lst)
  (cond ((null? lst) lst)
        ((cons? (car lst))
         (cons (deep-list-remove f (car lst)) (deep-list-remove f (cdr lst))))
        ((f (car lst)) (deep-list-remove f (cdr lst)))
        (else (cons (car lst) (deep-list-remove f (cdr lst))))))