練習問題 : let (解答例)


以下のプログラムの実行させ、なぜそうなるか考えよ。
(define (exercise-sample0 x)
    (let ((x 10)
	  (y (+ x 5)))
      (* x y)))

(define (exercise-sample1 x)
    (let* ((x 10)
	   (y (+ x 5)))
      (* x y)))

(define (exercise-1)
    (= (exercise-sample0 1)
       (exercise-sample1 1)))

> (exercise-1)    ; 実行
#f                ; 結果

まず、 exercise-sample0 について考える。 let の中で、 x, y が束縛されているが、 その scope は、 body 部、つまり、 (* x y) に限られる。 y の束縛値の評価の中で現われる x は、 関数 exercise-sample0 の引数、 つまり、 (exercise-sample0 1) の評価においては 1 を示す。 結果、let の body 部 (* x y) の評価においては、 x: 10, y: 6, (* x y): 60 となる。

一方、 exercise-sample1 では、 let* が用いられている。 このため、始めの節の x の束縛は、 次の節の評価においてすでに有効であり、 y の束縛値の評価の中で現われる x は、 10 である。 結果、let の body 部 (* x y) の評価においては、 x: 10, y: 15, (* x y): 150 である。

よって、上述のように結果 false を返した。

問題


99.10.6/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp