如何在 Racket 语言中将过程作为参数传递?

How to pass a procedure as a parameter in Racket Language?

(define (remove (lambda) lst)
  (if (empty? lst)
      0
      (if ((lambda(car lst) = 'false))
          (cons (car lst '() lambda (cdr lst)))
          (lambda (cdr lst)))))

这段代码用于检查列表中的数字是否通过称为 lambda 的测试,以及 return 没有通过元素的列表。 所以像 (remove (lambda (x) (= x 0)) (list 0 1 2 3)) 这样的命令可以将 lambda 函数作为参数传递并在 remove 函数中使用它。我应该怎么做?

您所描述的函数通常称为 (filter),它是 Scheme 中的标准函数。基本实现可能如下所示:

(define (remove test lst)
  (cond
    ((null? lst) '())
    ((test (car lst)) (remove test (cdr lst)))
    (else (cons (car lst) (remove test (cdr lst))))))

如何使用它的示例可能是:

(remove (lambda (x)
          (even? x))
        '(1 2 3 4 5 6 7))

其输出为

'(1 3 5 7)

编辑:我还想出了一个 tail-recursive 变体,它应该 运行 在 almost-constant space,但阅读起来要复杂得多。

(define (remove test lst)
  (let loop ((filtered-list '())
             (remainder-list lst))
    (if (null? remainder-list)
        filtered-list
        (let* ((testable-element (car remainder-list))
               (forward-list
                (if (test testable-element)
                    filtered-list
                    (append filtered-list (list testable-element)))))
          (loop forward-list (cdr remainder-list))))))