(wat-aro)

無職から有職者にランクアップしました

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