问题描述
原题目没有P29,这道题来源于水木的一个帖子。题目是这样的:
Use the unrestricted lambda to define a composition procedure compose-many
that forms the composition of arbitrarily many procedures of one argument.Test your procedure on
((compose-many add1 add1 add1 add1) 3) => 7
((compose-many sqrt abs sub1 (lambda (n) (* n n))) 0.6) => 0.8
解法
跟前面的列表操作不同,这里列表的元素都是函数。题目要求定义一个函数,该函数依次从右到左将列表中的函数应用于右侧返回的结果。
- 函数实现
(define compose-many
(lambda fs
(cond
[(null? fs) (lambda (x) x)]
[else
(lambda (x) ((car fs) ((apply compose-many (cdr fs)) x)))])))
- 宏实现
(define-syntax compose-many
(syntax-rules ()
[(_) (lambda (x) x)]
[(_ f1 f2 ...)
(lambda (x)
(f1 ((compose-many f2 ...) x)))]))