如何在 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))))))
(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))))))