代入を導入することによって置き換えモデルが適用できなくなったので,いわゆる環境モデルを導入しましたというお話.
環境モデルの元では,関数(原文ではprocedure)定義はlambdaのシンタックスシュガー.
(define (square x) (* x x))
は実際には環境で
(define square (lambda (x) (* x x)))
という風にして,global environmentが指すフレーム中にbindされる.
関数を評価するときは,一時的に新たなフレームが生成され,そこで関数の実引数が仮引数にbindされる.このフレームは実際にはglobal environmentの指すフレームの子フレームとなっていて,関数のbodyを見るときは親フレームへ探しにいって,関数の計算を行い,その結果を返す.set!は,変数にbindされている値を変更する.
問題は環境モデルにあてはめた図をかくってことなので,下のような感じかなー.
body部はメンドいのでとばした.
(define (factorial n) (if (= n 1) 1 (* n (factorial (- n 1)))))
(define (factorial n) (fact-iter 1 1 n)) (define (fact-iter product counter max-count) (if (> counter max-count) product (fact-iter (* counter product) (+ counter 1) max-count))