3.2
実行した関数が作る環境について?
Ex 3.9
再帰バージョン
(define (factorial n)
(if (= n 1) 1 (* n #?=(factorial (- n 1)))))
Trace
CALL factorial 6
# ?="./ex3.9.scm":2:(factorial (- n 1))
CALL factorial 5
# ?="./ex3.9.scm":2:(factorial (- n 1))
CALL factorial 4
# ?="./ex3.9.scm":2:(factorial (- n 1))
CALL factorial 3
# ?="./ex3.9.scm":2:(factorial (- n 1))
CALL factorial 2
# ?="./ex3.9.scm":2:(factorial (- n 1))
# ?- 1
RETN factorial 2
# ?- 2
RETN factorial 6
# ?- 6
RETN factorial 24
# ?- 24
RETN factorial 120
# ?- 120
RETN factorial 720
反復バージョン
(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)))
Trace
CALL factorial 6
RETN factorial 720
解答ver1

Ex.3.9 修正
誰が読んだかは関係なくて、その関数の空間が何をみてるかを指してる
(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)))
は
- global <- factorial
- global <- fact-iter
例えば
(define (a x)
(define (b y) '1)
(define (c z) '2)
)
global <- a <- b
↑c
b,cはaが見えてるし, globalも見えてる
-
(a 1)
を呼ぶと, その時に1つ新しいフレーム (E1) ができて, E1 -> global と, 引数用の x = 1 で初期化される. - (a 1) の実行ステップが (define (b x) ...) にたどり着くと, E1 の中に b っていう名前が増える この時はフレームは増えない
なので・・・
解答ver2
