SICP 読み (183) 4.2.2 遅延評価の解釈系
昨晩のエントリですが、朝イチで試験にかけてみたら NG でした。どこかでボケをぶちカマしている模様。疲れているのと理解不足が原因ではないかと。
# って理解不足か。 (とほほ
再検討
直前エントリにて count は 2 と断言しているが根拠がよく分からん。
(define w (id (id 10)))
この式が評価されてどうなるか、が問題なんだと思う。細かく切り分けるから微妙になると見て式全体がどうか、な形で検証してみよう。まず上記の式は definition 認定で eval-definition に渡されて以下の式が適用。あと env はこの時点では the-global-environment だはず。
(define-variable! w (eval (id (id 10)) env) env)
(id (id 10)) が eval されるとどうなるか、というと application 認定なので
(define-variable! w (apply (actual-value id env) ((id 10)) env) env)
この時点では id は
(procedure (x) ((set! count (+ count 1)) x) env)
に束縛されておりますので eval されて上記の式が戻ります。
(define-variable! w (apply (procedure (x) ((set! count (+ count 1)) x) env) ((id 10)) env) env)
で、apply に渡ってこうなるのかなぁ。
(define-variable! w (eval-sequence ((set! count (+ count 1)) x) (extend-environment (x) ((thunk (id 10) env)) env)) env)
上記を見るに count は 1 加算されて w には (thunk (id 10) env) が束縛、で処理終了に見えるな。むむ。
結論
てコトは一回目に (actual-value 'count env) したら戻りは 1 で、(actual-value 'w env) したら (thunk (id 10) env) がナニされて 10 が戻って、再度 (actual-value 'count env) したら 2 が戻る、と。
これなら試験で確認した通りになります。とほほほ。