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


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

这段代码用于检查列表中的数字是否通过了名为lambda的测试,并返回一个没有传递元素的列表。所以像(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)

EDIT:我还煞费苦心地提出了一个尾部递归变体,它应该在几乎恒定的空间中运行,但读取起来要复杂得多。

(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))))))

最新更新