SICPを読む(65)

Such nesting of definitions, called block structure, is basically the right solution to the simplest name-packaging problem. But there is a better idea lurking here. In addition to internalizing the definitions of the auxiliary procedures, we can simplify them. Since x is bound in the definition of sqrt, the procedures good-enough?, improve, and sqrt-iter, which are defined internally to sqrt, are in the scope of x. Thus, it is not necessary to pass x explicitly to each of these procedures. Instead, we allow x to be a free variable in the internal definitions, as shown below. Then x gets its value from the argument with which the enclosing procedure sqrt is called. This discipline is called lexical scoping.

(define (sqrt x)
  (define (good-enough? guess)
    (< (abs (- (square guess) x)) 0.001))
  (define (improve guess)
    (average guess (/ x guess)))
  (define (sqrt-iter guess)
    (if (good-enough? guess)
        guess
        (sqrt-iter (improve guess))))
  (sqrt-iter 1.0))

We will use block structure extensively to help us break up large programs into tractable pieces. The idea of block structure originated with the programming language Algol 60. It appears in most advanced programming languages and is an important tool for helping to organize the construction of large programs.


ブロック構造と呼ばれる定義の入れ子は、基本的には単純な名前のパッケージ問題に対する正しい解法である。
しかし、もっと良いアイデアがある。補助プロシージャの定義の内部化に加え、それらの単純化もできる。
xがsqrtの定義で使用されても、good-enough?, improbe, sqrt-iterはxのスコープ内、sqrtの内部にある。
したがって、明らかにxがそれぞれのプロシージャにパスされる必要は無い。
そのかわり、私たちはその内部定義の中で、下に示すようにxが自由変数であることを許可しなければならない。
そして、xは囲い込まれたプロシージャsqrtが呼ばれると引数から自身の値を得る。
この規則は、レキシカル・スコーピングと呼ばれている。

(define (sqrt x)
  (define (good-enough? guess)
    (< (abs (- (square guess) x)) 0.001))
  (define (improve guess)
    (average guess (/ x guess)))
  (define (sqrt-iter guess)
    (if (good-enough? guess)
        guess
        (sqrt-iter (improve guess))))
  (sqrt-iter 1.0))


私たちはブロック構造を巨大なプログラムを扱いやすいピースに分解するために手広く用いる。
このブロック構造のアイデアはAlgol 60というプログラミング言語に起源を持つ。
それは高度な主要プログラミング言語のほとんどに見られると同時に、巨大なプログラムを作る際の重要な道具の一つである。