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

问题描述

原题目没有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)))]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值