Function 在方案中结合两种功能

Function 在方案中结合两种功能,function,recursion,scheme,lisp,composition,Function,Recursion,Scheme,Lisp,Composition,我在自己的代码中完成了过滤函数和反转函数 (define reverse_ (lambda (xs) (if (null? xs) xs (append (reverse_ (cdr xs)) (list (car xs)))))) 及 我想将这两个函数组合成(反向筛选)函数,即您可以键入(反向筛选符号?'(1 2 3 a b c)),它将返回->c b a 现在只需简单地键入(反向(filter)symbol?'(1

我在自己的代码中完成了过滤函数和反转函数

(define reverse_
  (lambda (xs)
    (if (null? xs)
        xs
        (append (reverse_ (cdr xs))
                (list (car xs))))))

我想将这两个函数组合成
(反向筛选)
函数,即您可以键入
(反向筛选符号?'(1 2 3 a b c))
,它将返回
->c b a

现在只需简单地键入
(反向(filter)symbol?'(1 2 3 a b c))->c b a
,即可工作,但我只想将两者结合起来


对于在一般情况下以及在具体情况下提供的任何帮助,我们将不胜感激。

对于一般情况,我们可以使用和程序(希望您的解释器中提供),它们允许我们操作其他程序:

((compose (curry filter_ symbol?) reverse_)
 '(1 2 3 a b c))
=> '(c b a)
为了便于说明,下面是这两个过程的简单实现,以了解它们在引擎盖下做什么:

(define (curry f x)
  (lambda (y) (f x y)))

(define (compose f g)
  (lambda (x) (f (g x))))

compose
是正确且懒惰的做法,但是,由于列表是从头到尾迭代的,但却是从头到尾创建的,因此一次创建相反的结果实际上效率更高:

(define (reverse-filter p? xs)
  (define (helper lst acc)
    (if (null? lst)
        acc
        (helper (cdr lst)
                (let ((a (car lst)))
                  (if (p? a)
                      (cons a acc)
                      acc)))))
  (helper xs '()))

(reverse-filter symbol? '(1 2 3 a b c))
; ==> (c b a)
(define (reverse-filter p? xs)
  (define (helper lst acc)
    (if (null? lst)
        acc
        (helper (cdr lst)
                (let ((a (car lst)))
                  (if (p? a)
                      (cons a acc)
                      acc)))))
  (helper xs '()))

(reverse-filter symbol? '(1 2 3 a b c))
; ==> (c b a)