以下是 or-gate
的定义:
;;; 28-or-gate.scm
(define (or-gate input-1 input-2 output)
(define (or-action-procedure)
(let ((new-value
(logical-or (get-signal input-1) (get-signal input-2))))
(after-delay or-gate-delay
(lambda ()
(set-signal! output new-value)))))
(add-action! input-1 or-action-procedure)
(add-action! input-2 or-action-procedure)
'ok)
(define (logical-or x y)
(if (or (= x 1) (= y 1))
1
0))
接着用这个 or-gate
进行模拟,看看它的定义是否正确(模拟所需的所有代码在书本的后面会给出):
1 ]=> (load "p194-simula.scm") ; 载入模拟程序
;Loading "p194-simula.scm"...
; Loading "28-or-gate.scm"... done
; Loading "p190-full-adder.scm"... done
; Loading "p190-half-adder.scm"... done
; Loading "p191-and-gate.scm"... done
; Loading "p191-inverter.scm"... done
; Loading "p192-wire.scm"... done
; Loading "p194-after-delay.scm"... done
; Loading "p194-probe.scm"... done
; Loading "p194-propagate.scm"... done
; Loading "p196-agenda.scm"...
; Loading "p181-queue.scm"... done
; ... done
;... done
;Value: or-gate-delay
1 ]=> (define input-1 (make-wire)) ; 创建三条线路
;Value: input-1
1 ]=> (define input-2 (make-wire))
;Value: input-2
1 ]=> (define output (make-wire))
;Value: output
1 ]=> (or-gate input-1 input-2 output) ; 将线路连接到 or-gate
;Value: ok
1 ]=> (propagate) ; 执行模拟
;Value: done
1 ]=> (get-signal output) ; 因为线路的默认信号值为 0 ,所以 output 线路的值为 (logical-or 0 0) 等于 0
;Value: 0
1 ]=> (set-signal! input-1 1) ; 将其中一条输入线路的信号值设置为 1
;Value: done
1 ]=> (propagate) ; 再次执行模拟
;Value: done
1 ]=> (get-signal output) ; 这次信号的值为 1 和 0 ,所以 output 线路的值为 (logical-or 1 0) 等于 1
;Value: 1