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で古い値を保存している.