Racket 部分函数在球拍中的应用

Racket 部分函数在球拍中的应用,racket,Racket,我正在编写一个函数,将参数部分应用于函数,这样 (define mapeven (partial-apply map even?)) (mapeven (list 1 2 3 4)) ; '(#f #t #f #t) 为此,我必须 (define (partial-apply* func . args) (define (apply-one func arg) (λ args (apply func (cons arg args)))) (foldl (λ (new carry

我正在编写一个函数,将参数部分应用于函数,这样

(define mapeven (partial-apply map even?))
(mapeven (list 1 2 3 4)) ; '(#f #t #f #t)
为此,我必须

(define (partial-apply* func . args)
  (define (apply-one func arg)
    (λ args (apply func (cons arg args))))
  (foldl (λ (new carry) (apply-one carry new)) func args))
这似乎很管用。然而,我也希望能够通过使用哨兵值跳过args,比如‘λ’。即:

(define apply-to-four (partial-apply map 'λ (list 1 2 3 4))
(apply-to-four even?) ; '(#f #t #f #t)
也就是说,当partial apply遇到“λ”时,它不会将值绑定到该位置,而是将其保留为自由变量。当一个部分应用的函数被调用时,首先它将填充由‘λ’机制跳过的参数,然后它将把所有剩余的参数应用到最后

为此,我写了:

(define (partial-apply func . args)
  (define (apply-one func arg)
    (if (equal? arg 'λ)
        (λ args (λ (x) (apply func (cons x args)))))
        (λ args (apply func (cons arg args)))))
  (foldl (λ (new carry) (apply-one carry new)) func args))
但是,它不起作用

> (define apply-to-4 (partial-apply map 'λ (list 1 2 3 4)))
> (apply-to-4 even?)
#<procedure>

问题似乎出在if语句的肯定分支中,但我很难确定它。有什么建议吗?

你这么做只是为了好玩,对吗?因为已经有了一个剪切宏,可以满足您的需要:define apply to four cut map'1 2 3 4我不知道,但我仍然想了解它是如何工作的,并编写自己的代码来实现这一点。所以请阅读该页。它描述了实现它所需知道的一切:参考实现也值得一看。