2016/01/29

SICP 問題 5.18

レジスタの値をトレース出来るようにする

;;; registerがtraceを持ち,trace-onがメッセージパッシングされたらトレースする.
(define (make-register name)
  (let ((contents '*unssaigned*)
        (trace (lambda (contents value) #f)))
    (define (dispatch message)
      (cond ((eq? message 'get) contents)
            ((eq? message 'set)
             (lambda (value)
               (trace contents value)
               (set! contents value)))
            ((eq? message 'trace-on)
             (set! trace (lambda (contents value)
                           (format #t "register: ~6s   oldv-value: ~s new-value: ~s\n"
                                   name contents value)))
             'trace-on)
            ((eq? message 'trace-off)
             (set! trace (lambda (contents value) #f))
             'trace-off)
            (else
             (error "Unknown request -- REGISTER" message))))
    dispatch))

© 2022 wat-aro