SICPを読む(98) 問題 3.9 - 評価モデル
どうもSICPの評価モデルの解説が曖昧だ。返された値がどうなるかについて解説されていないので、おかしな図になってる。
Scheme実装中なので、僕の実装で書いてみよう。
問題 3.9
階乗の再帰と反復を環境モデルで表せ。という問題。
(factional 3)で先に反復を。
大域環境 +-------------------------- |factional (lambda (n) ... |factiter (lambda (product counter max-count) ... +-------------------------- V +-------+ 6 factional | n : 3 | +-------+ A V | +-------------+ +-------------+ +-------------+ +-------------+ |product : 1 | |product : 3 | |product : 6 | |product : 6 | factiter |counter : 1 | > |counter : 2 | > |counter : 3 | > |counter : 4 | |maxcount : 3 | |maxcount : 3 | |maxcount : 3 | |maxcount : 3 | +-------------+ +-------------+ +-------------+ +-------------+
となる。ポイントはreturnせず継続してるって所。
再帰のほうは、継続が無いとうまく説明出来ない。右に継続を出しておく。
大域環境 +-------------------------- |factional (lambda (n) ... +-------------------------- V +-------+ factional | n : 3 | +-------+ V +-------+ factional | n : 2 | (lambda (a) (* 3 a)) +-------+ V +-------+ factional | n : 1 | (lambda (b) ((lambda (a) (* 3 a)) (* 2 b))) +-------+ V +-------+ cont | b : 1 | (lambda (b) ((lambda (a) (* 3 a)) (* 2 b))) +-------+ V +-------+ cont | a : 2 | (lambda (a) (* 3 a)) +-------+ V 大域環境 6
継続を実行するのは閉じ括弧が来たとき。
(* 3 (* 2 1...
となってて、閉じ括弧が
(* 3 (* 2 1)
お、継続を見よう。と思うわけ。
これでスッキリうまくいく。
ここに辿りつくまでが長かった・・・まだまだ先がありそうなんだよね。