2016/01/18
SICP 問題 4.70
本文中のadd-assertion!とadd-rules!のletの目的は何か. 問題文のadd-assertion!ではダメな理由を述べよ.
;; 本文中のadd-assertion!
(define (add-assertion! assertion)
(store-assertion-in-index assertion)
(let ((old-assertions THE-ASSERTIONS))
(set! THE-ASSERTIONS
(cons-stream assertion old-assertions))
'ok))
;; 問題文のadd-assertion!
(define (add-assertion! assertion)
(store-assertion-in-index assertion)
(set! THE-ASSERTIONS
(cons-stream assertion THE-ASSERTIONS))
'ok)
cons-streamはcarは評価し,cdrはdelayしてconsしている.
そのため,問題文のadd-assertion!ではset!した時にassertionは評価されているが,THE-ASSERTIONSは評価されていない.
それがTHE-ASSERTIONSに代入されるのでもともとのTHE-ASSERTIONSにアクセスできなくなる.
それを防ぐために本文中のadd-assertion!とadd-rule!ではset!する前にletで古い値を保存している.