我正在编写一个函数来将参数部分应用于函数,例如
(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)
也就是说,当部分应用遇到'λ时,它不会将值绑定到该位置,而是将其作为自由变量。当一个部分应用的函数被调用时,首先它将填充这个'λ机制跳过的参数,然后它会将任何剩余的参数应用到结尾。
为此,我写了:
(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语句的肯定分支中,但我无法确定它。有什么建议吗?