P29 (**) Compose arbitrarily many procedures of one argument.

来源:互联网 发布:域名续费怎么收费 编辑:程序博客网 时间:2024/04/26 04:52

问题描述

原题目没有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)))]))
1 0