Macros 在compose函数中反转函数用法

Macros 在compose函数中反转函数用法,macros,scheme,racket,Macros,Scheme,Racket,该函数首先应用最后一个函数,即按相反顺序应用发送的函数。例如: ((compose sqrt add1) 8) 上面将1添加到8,然后找到9的sqrt 我想创建一个mycompose函数,它首先应用第一个sent函数,然后应用第二个、第三个等。因此,在上面的示例中,需要首先应用sqrt,然后再应用add1。我可以做到以下几点: (define (mycompose L arg) (let loop ((L L) (res arg)) (cond

该函数首先应用最后一个函数,即按相反顺序应用发送的函数。例如:

((compose sqrt add1) 8)
上面将1添加到8,然后找到9的sqrt

我想创建一个mycompose函数,它首先应用第一个sent函数,然后应用第二个、第三个等。因此,在上面的示例中,需要首先应用sqrt,然后再应用add1。我可以做到以下几点:

(define (mycompose L arg)
  (let loop ((L L)
             (res arg))
    (cond
      [(empty? L) res]
      [else (loop (rest L) ((car L) res))])))

(mycompose (list sqrt add1) 8)

我相信有更好的办法。特别是,可以使用宏实现上述功能,并允许将多个参数依次发送到每个函数吗

你描述的这种“反向构图”通常被称为画眉,而这正是你想要的。但是,假设您想自己实现它。嗯,最简单的方法是重用
compose
的现有实现,因为
thrush
只是
compose
,参数是相反的:

(define (thrush . fs)
  (apply compose (reverse fs))
事实上,这就是无点包如何实现
thrush
。不过,这可能会让您不满意,因为您不知道如何实现
compose
。幸运的是,我们可以通过简单的折叠从零开始实现
画眉

(define (thrush . fs)
  (for/fold ([f values])
            ([g (in-list fs)])
    (λ args (call-with-values (thunk (apply f args)) g))))

这里真正的技巧是使用,它正确地处理返回多个值的函数。就像Racket的
组合
,这将接受多个值,并将它们作为多个参数传递给管道中的函数,在函数输入和函数输出之间创建一个良好的对称性。

您描述的这种“反向组合”通常被称为画眉,这正是您想要的。但是,假设您想自己实现它。嗯,最简单的方法是重用
compose
的现有实现,因为
thrush
只是
compose
,参数是相反的:

(define (thrush . fs)
  (apply compose (reverse fs))
事实上,这就是无点包如何实现
thrush
。不过,这可能会让您不满意,因为您不知道如何实现
compose
。幸运的是,我们可以通过简单的折叠从零开始实现
画眉

(define (thrush . fs)
  (for/fold ([f values])
            ([g (in-list fs)])
    (λ args (call-with-values (thunk (apply f args)) g))))

这里真正的技巧是使用,它正确地处理返回多个值的函数。就像Racket的
compose
,这将接受多个值,并将它们作为多个参数传递给管道中的函数,在函数输入和函数输出之间创建一个良好的对称性。

您可以将函数实现为
(define(mycompose.fs)(apply compose(reverse fs))
,无需宏即可满足您的所有要求。我知道有更好的方法。谢谢。您只需将函数实现为
(define(mycompose.fs)(apply compose(reverse fs))
,即可满足您的所有要求,无需宏。我知道有更好的方法。谢谢。