尝试制作一个名为make-odd-mapper的方案程序!它应该是一个过程,它接受一个输入,一个过程,并产生一个过程作为输出
例如:
(定义i4(mlist 10 2 30 4))
(6-14)
{10 2 30 4}
((make-odd-mapper!add-one)i4)
6-14
{11 2 31 4}
我知道问题需要改变输入列表和set-mcar!和虚空是它的一部分......任何人都可以给我一些合理的代码来解决这个问题吗?如果有人想知道变异.....并用它来创建一个以程序为输出的程序,这将是有用的。
答案 0 :(得分:0)
嗯,不久之后提出的问题是不可能的。原因是,如果可能,那么你可以有一个表达式:
(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))))))