有时当你写着程序, 就卡住了. 或许这是因为你意识到你没能理解问题的某个方面, 但更多情况下往往是因为你先前在程序设计的阶段做出了一个关于数据结构或者代码组织方式的决策, 太过局限而又很难重来.
本书是关于维护灵活性的特定程序组织策略的大师课程. 现在我们都知道尽管声明一个固定长度的数组用于存放要被处理的数据是很容易的事情, 然而这样一个设计决定往往成为令人不快的限制,
(define (compose f g)
(lambda args
(f (apply g args))))
(define (compose f g)
(define (the-composition . args)
(f (apply g args)))
the-composition)
(define ((iterate n) f)
(if (= n 0)
identity
(compose f ((iterate (- n 1)) f))))
(define (identity x) x)
(define (parallel-combine h f g)
(define (the-combination . args)
(h (apply f args) (apply g args)))
the-combination)
以下是译者擅自补充的例子, 算术平均值.
(define mean
(parallel-combine / + (lambda args (length args))))
注记: 从本质上说, 本节只是为惯常的正则表达式设计了另一种句法.
有时我们可以通过包装现有的程序而不是重写来改变目的.