1.3 Formulating Abstractions with Higher-Order Procedures
proceduresとは、結局のところ、特定の数ではなく、あらゆる数に適応可能なcompound operationを記述する抽象手法であることがわかった。たとえば、
(define (cube x) (* x x x))
と定義するとき、特定の数の立方ではなく、あらゆる数の立方を得る方法を話題にしている。もちろん、このprocedureを定義せずに、以下のような式を毎回書いて、立方について明示せずに済ませることもできる。
(* 3 3 3)
(* x x x)
(* y y y)
この方法には深刻な不都合があり、高いレベルの演算を使わずに、言語にたまたま組み込みのprimitivesを使っての演算レベル(このケースでは乗算)で、常に仕事をしなければならない。上記プログラムは立方を計算できるが、言語には立方の概念を表す能力がない。強力なプログラミング言語に望む事のひとつは、よくあるパターンに名前を付けて抽象化し、その抽象を直接利用して仕事をする能力である。
proceduresのパラメータが常に数値である必要があるなら、数値処理においてさえ、抽象化能力が激しく制限される。同様のプログラミングパターンが様々に異なるproceduresと共に使われることがある。このようなパターンを概念として表現するには、proceduresを実引数として受け取る、または、値としてproceduresを戻すproceduresを構築する必要がある。proceduresを操作するproceduresを高階proceduresと呼ぶ。このセクションでは、高階proceduresが強力な抽象メカニズムとして機能し、言語の表現力が拡大して行く様を見て行く。