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 が戻る、と。
これなら試験で確認した通りになります。とほほほ。