我正在编写一个函数来将参数部分应用于函数,这样
(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(可能通过使用标记值,例如 'λ)。IE:
(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 语句的肯定分支中,但我无法确定它。有什么建议吗?