プログラミング再入門

プログラミングをもう一度ちゃんと勉強する読書ノート

SICP 1.1.8 Procedures as Black-Box Abstractions

ノート

ブラックボックスとしての手続き。
再帰については1.2で詳しく。

問題を小さな問題に分割する。大きな問題を小さな問題に分解すると言っても長いプログラムを10行毎に分割する訳ではない。意味のある一塊毎に分解し、その実装を気にしなくても使える様に抽象化する。

squareの二つの実装。

> (define (square x) (* x x))
> (square 12)
144
> (define (square x) 
    (exp (double (log x))))
> (define (double x) (+ x x))
> (square 12)
144.0
> 
Local Names

局所的な名前。

仮引数は関数本体でのみ有効で、仮に同じ名前を使っていても関数の呼び出し側等関数の外の変数とでは別の存在。
仮引数は呼び出される時に呼び出し側が与えた実引数と結び付くと言う意味で拘束変数(bound variable)と呼び、それ以外の変数を自由変数と呼んでいる。自由変数は所謂グローバル変数だったり、関数の中で定義された関数から見た外側の関数が持っている変数だったり。

Internal Definitions and Block Structure

内部定義とブロック構造。
最上位の関数sqrt(あるいはsquare-root)以外の補助的な関数はsqrtの内部でのみ参照出来る方が良い事がある。開発の規模が大きいと名前の数が爆発してしまう。関数の中でもdefineは使える。

> (square-root 15)
3.872983698008724
> 

入れ子になった定義をブロック構造と呼ぶ。
また関数名をローカルなスコープに閉じ込めるだけではなく、最上位の仮引数xの様に共通した値を参照している場合には内部の関数に引数として渡す必要は無く、内部の関数から外部の関数の変数へはアクセスが可能。

> (square-root 15)
3.872983698008724
>