3.28
(define (or-gate a b output)
(define (or-action)
(let ((new-value (logic-or (get-signal a) (get-signal b))))
(after-delay or-gate-delay (lambda () (set-signal! output new-value)))))
(add-action! a or-action)
(add-action! b or-action)
'ok)
3.29
a ∨ b == ~~(a ∨ b) == ~(~a ∧ ~b)
(define (or-gate a b output)
(let ((a-out (make-wire))
(b-out (make-wire))
(and-out (make-wire)))
(inverter a a-out)
(inverter b b-out)
(and-gate a-out b-out and-out)
(inverter and-out output)))
3.30
(define (ripple-carry-adder a b s c)
(if (null? (cdr a))
(let ((cn (make-wire)))
(full-adder (car a) (car b) cn (car s) c))
(let ((ck (make-wire)))
(ripple-carry-adder (cdr a) (cdr b) (cdr s) ck)
(full-adder (car a) (car b) ck (car s) c))))