問題3.32 – SICP(計算機プログラムの構造と解釈)その130

問題3.32

agenda のデータ構造

agenda のデータ構造図

(define the-agenda (make-agenda))
(define and-gate-delay 3)
(define a (make-wire))
(define b (make-wire))
(define c (make-wire))
(probe 'c c)
(and-gate a b c)
(set-signal! b 1)
(propagate) ;=> 次第書きに登録されたアクションを一度クリアするためにシミュレーションを実行する。
gosh> done-agenda

; the-agenda => (3)
(set-signal! a 1)   ;; add-action! で回線 a にアクション手続きが追加されて、次第書き the-agenda に登録される
gosh> done-call-each
; the-agenda => (3 (6 #0=(#<closure (and-gate and-action-procedure #f)>) . #0#))
(set-signal! b 0)   ;; add-action! で回線 b にアクション手続きが追加されて、次第書き the-agenda に登録される
gosh> done-call-each
; the-agenda => (3 (6 (#<closure (and-gate and-action-procedure #f)> . #0=(#<closure (and-gate and-action-procedure #f)>)) . #0#))

;; この時点で、次第書き the-agenda には2つのアクション手続きが登録されている。
;; 次第書きのアクションは、"回線aに登録されたアクション"、"回線bに登録されたアクション" の順で実行される。

(propagate)
gosh> 
c 6 New-value = 1
c 6 New-value = 0done-agenda

次第書きのアクションが最後に入ったものが最初に出る(LIFO)の場合は、”回線bに登録されたアクション”、”回線aに登録されたアクション” の順で実行される。
この場合は出力回線 c に変化は起こらず 0 のままとなりシミュレーションが正常に実行されない。

; the-agenda => (3)
(set-signal! b 0)
gosh> done-call-each
; the-agenda => (3 (6 #0=(#<closure (and-gate and-action-procedure #f)>) . #0#))
(set-signal! a 1)
gosh> done-call-each
; the-agenda => (3 (6 (#<closure (and-gate and-action-procedure #f)> . #0=(#<closure (and-gate and-action-procedure #f)>)) . #0#))
(propagate)
gosh> done-agenda
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»