练习 3.28

以下是 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

讨论

blog comments powered by Disqus