さて、提示された問題は、簡単に言えば、不可能です。その理由は、可能であれば、次の式を使用できるからです。
(make-odd-mapper! add-one)
これは、部分適用によって作成された関数の関数になります。ただし、この関数はそのオペランドを変更する必要があり、これはマクロによってのみ行うことができます。したがって、その関数の結果はマクロになりますが、マクロは値として存在しないため、これは不可能です。ただし、 の定義を少し変更することで、make-odd-mapper!
少し異なることを行うことができます。この場合、元の質問とまったく同じように使用しますが、言う代わりに
((make-odd-mapper! add-one) i4)
あなたは言うでしょう
(make-odd-mapper! add-one i4)
この方法でそれを行うコードは次のとおりです。
;;; Applies its argument to every other element of a list.
(define map-every-other
(lambda (function lis)
(let map-every-other ((function function) (lis lis) (acc '()) (other #t))
(if (null? lis)
acc
(map-every-other
function
(cdr lis)
(append acc (list (if other (function (car lis)) (car lis))))
(not other))))))
;;; This function does the odd mapping, but returns
;;; the new function instead of mutating the original.
(define make-odd-mapper
(lambda (function-to-apply)
(lambda (function)
(lambda ()
(map-every-other function-to-apply (function))))))
;;; This macro mutates the original function by using make-odd-mapper
(define-syntax make-odd-mapper!
(syntax-rules ()
((_ function-to-apply function)
(begin
(set! function
((make-odd-mapper function-to-apply) function))))))