1.2 Procedures and the Processes They Generate
これまで、プログラミングの要素について考えてきた。基本的な算術演算を使い、これらの演算を組み合わせ、compound proceduresとして定義し抽象化した。これだけではプログラミングを知っているとは言えない。チェスの駒を動かすルールは知っているが、手筋について何も知らない人みたいなものだ。初心者のチェスプレイヤーのように、この分野で何かを行う場合の、一般的パターンをまだ知らない。どちらへ動かせば効果的か(どのproceduresに定義する価値があるか)がわからない。動かした(proceduresを実行した)結果を予測する経験もない。
あるアクションを検討する時に、その結果を視覚化する能力が、あらゆる構成的・創造的活動には不可欠なように、熟練したプログラマーになるには不可欠である。例えば、熟練した写真家になるには、情景の見方、および、さまざまな露出と現像との組み合わせにより、各領域が印画紙ではどれくらいの濃さで現れるか、を学ぶ必要がある。そうして初めて、反対方向(結果から作用)に推測し、構図、照明、露出、現像を計画し、望んだ効果を得ることができるようになる。プログラミングにおいても同様で、processがおこなう一連のアクションを計画し、programによってprocessをコントロールする。エキスパートになるには、あらゆる種類のproceduresが生成するprocessesを視覚化できるようにならねばならない。そうして初めて、望んだ通りの動作をするプログラムを、安心して構築できる能力が養える。
procedureとは、計算プロセスのローカルな進行のパターンで、processの各段階が、ひとつ前の段階の上に、どう構築されるかを規定する。processの全体的、ないしはグローバルな振る舞いを、そのローカルな進行がprocedureによって規定されるものとして、記述できるようにしたい。これは一般的には難しいが、process進行の典型パターンをいくつか記述することはできる。
このセクションでは、単純なproceduresが生成するprocessesの一般「形」をいくつか調べる。また、これらprocessesが、計算上の重要な資源である時間とスペースをどう消費するかも調べる。使用するproceduresはとても単純だ。その役割は、写真術でのテストパターンのようなもので、それ自身は、現実的な例と言うより、ものすごく単純化されたプロトタイプのパターンである。
----------
(define (sum-of-square x y)
(+ (square x) (square y)))
(define (square x)
(* x x))
kinds of expressions
- numbers
- symbols
- lambda expressions
- definitions
- conditionals
- conbinations
Substitution Rule:
To evaluate an application
Evaluate the operator to get procedure
Evaluate the operands to get arguments
Apply the procedures to the arguments
Copy the body of the procedures, substituting the arguments supplied for the formal parameters of the procedure.
Evaluate the resulting new body
(sum-of-squares 3 4)
(+ (square 3) (square 4))
(+ (* 3 3) (* 4 4))
(+ 9 16)
25
To evaluate an IF expression
Evaluate the predicate expression
if it yields TRUE
evaluate the consequent expression
otherwise
evaluate the alternative expression
(IF (predicate) (consequent) (alternative))
(define (+ x y)
(if (= x 0)
y
(+ (-1+ x) (1+ y))))
(+ 3 4)
(if (= 3 0) 4 (+ (-1+ 3) (1+ 4)))
(+ (-1+ 3) (1+ 4))
(+ (-1+ 3) 5)
(+ 2 5)
(if (= 2 0) 5 (+ (-1+ 2) (1+ 5)))
(+ (-1+ 2) (1+ 5))
(+ (-1+ 2) 6)
(+ 1 6)
(if (= 1 0) 6 (+ (-1+ 1) (1+ 6)))
(+ (-1+ 1) (1+ 6))
(+ (-1+ 1) 7)
(+ 0 7)
(if (= 0 0) 7 (+ (-1+ 0) (1+ 7)))
7