関数に引数を部分的に適用する関数を書いています。
(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))
これはうまくいくようです。ただし、引数を「スキップ」できるようにしたいと思います(おそらく「λ」などのセンチネル値を使用することにより)。いいえ:
(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文の肯定分岐にあるようですが、突き詰めるのに苦労しています。何かアドバイス?