xor回路シュミレータ
SICPの3.3.4でディジタル回路のシュミレータを作るのだが、そういえばどうせなのでXORも作ってみようとふと思い、この節の復習も兼ねて作ってみた。といっても簡単だけど。
(define (xor-gate a1 a2 output) (define (xor-action-procedure) (let [(new-value (logical-xor (get-signal a1) (get-signal a2)))] (after-delay xor-gate-delay (lambda () (set-signal! output new-value))))) (add-action! a1 xor-action-procedure) (add-action! a2 xor-action-procedure) 'ok) (define (logical-xor x y) (if (= x y) 0 1))
テスト
;;test (define the-agenda (make-agenda)) (define input-1 (make-wire)) (define input-2 (make-wire)) (define output (make-wire)) (probe 'input-1 input-1) (probe 'input-2 input-2) (probe 'output output) (xor-gate input-1 input-2 output) (set-signal! input-1 1) (propagate) (set-signal! input-2 1) (propagate)
結果
gosh> the-agenda gosh> input-1 gosh> input-2 gosh> output gosh> input-1 0 New-value = 0 #<undef> gosh> input-2 0 New-value = 0 #<undef> gosh> output 0 New-value = 0 #<undef> gosh> ok gosh> input-1 0 New-value = 1 done gosh> output 4 New-value = 1 done gosh> input-2 4 New-value = 1 done gosh> output 8 New-value = 0 done
問題なし。