(let ((var-1 expr-1) .... (var-n expr-n)) body)では、 body 部の評価の際に現われた変数 var-1, ..., var-n の値は、 let で束縛した時の expr-1, ..., expr-n の値になります。 これは同時に、変数名 var-1 ,..., var-n が有効な範囲(スコープ: scope)を示した言葉でもあります。 つまり、 let 式で用いられた変数名ならびに値との束縛関係は、 その body 部においてのみ有効であるということです。
すこし下の例をみてみましょう。 対象としているvar0の宣言と 他のvar0の宣言が同居しています。 また、var0 を使用している箇所がいくつかあります。
(define var0 10) ; global な var0 の定義 (define (foo-callee) var0) ; var0 をみる関数 (define (foo x) ; 関数 foo の中で (+ var0 ; let の外(前)で var0 をみる (let ((var0 (* x x)) ; var0 の束縛 (var1 (* 2 var0))) ; 別の let 節の中の var0 (+ var0 ; let の中の var0 (foo-callee) ; 呼ばれた関数の中の var0 (let ((var2 3)) (+ var0 var2)) ; 入れ子 let の中の var0 (let ((var0 3)) var0) ; 入れ子の let (衝突)の中の var0 var1)) var0)) ; let の外(後)で var0 をみる一体、 var0が有効な範囲はどこなんでしょう。 実は、その時々の値を表示させることで調べることも 出来ます。 結論から言うと、 var0の変数名が有効なのは、 以下の範囲です。
(define var0 10) (define (foo-callee) var0) (define (foo x) (+ var0 (let ((var0 (* x x)) (var1 (* 2 var0))) (+ var0 (foo-callee) (let ((var2 3)) (+ var0 var2)) (let ((var0 3)) var0) var1)) var0))
99.10.6/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp