SICP問題3.31

.accept-action-proceduer!に初期化コードが入った状態で実行した場合

(define input-1 (make-wire))
; input-1
(define input-2 (make-wire))
; input-2
(define sum (make-wire))
; sum
(define carry (make-wire))
; carry
(probe 'sum sum)
; sum 0 New-value = 0#<undef>
(probe 'carry carry)
; carry 0 New-value = 0#<undef>
(half-adder input-1 input-2 sum carry)
; ok
(set-signal! input-1 1)
; done
(propagate)
; sum 8 New-value = 1
; done
(set-signal! input-2 1)
; done
(propagate)
; carry 11 New-value = 1
; sum 16 New-value = 0
; done

accept-action-proceduer!を初期化コードを外して

(define (accept-action-proceduer! proc)
  (set! action-procedures (cons proc action-procedures)))

に変更した状態で実行した場合

(define input-1 (make-wire))
; input-1
(define input-2 (make-wire))
; input-2
(define sum (make-wire))
; sum
(define carry (make-wire))
; carry
(probe 'sum sum)
; (#<closure (probe #f)>)
(probe 'carry carry)
; (#<closure (probe #f)>)
(half-adder input-1 input-2 sum carry)
; ok
(set-signal! input-1 1)
; done
(propagate)
; done
(set-signal! input-2 1)
; done
(propagate)
; carry 11 New-value = 1
; done

propagateはthe-agendaに登録されたアクションを順次実行する手続きである。
the-agendaへアクションを登録する手続きはadd-agenda!であり、add-agenda!手続きはafter-delay手続きの中で呼び出される
ここでafter-delay手続きの呼び出しは追加する各アクション手続きの中で行わており、アクションが実行されないとthe-agendaへの追加は行われないため、シミュレータは動作しない。
よって初期化処理が必要となる。