Chapter 3
3.1 Exercise 3.1
3.2 Exercise 3.2
3.3 Exercise 3.3
3.4 Exercise 3.4
3.5 Exercise 3.5
3.6 Exercise 3.6
3.7 Exercise 3.7
3.8 Exercise 3.8
3.9 Exercise 3.9
3.10 Exercise 3.10
3.11 Exercise 3.11
3.12 Exercise 3.12
3.13 Exercise 3.13
3.14 Exercise 3.14
3.15 Exercise 3.15
3.16 Exercise 3.16
3.17 Exercise 3.17
3.18 Exercise 3.18
3.19 Exercise 3.19
3.20 Exercise 3.20
3.21 Exercise 3.21
3.22 Exercise 3.22
3.23 Exercise 3.23
3.24 Exercise 3.24
3.25 Exercise 3.25
3.26 Exercise 3.26
3.27 Exercise 3.27
3.28 Exercise 3.28
3.29 Exercise 3.29
3.30 Exercise 3.30
3.31 Exercise 3.31
3.32 Exercise 3.32
3.33 Exercise 3.33
3.34 Exercise 3.34
3.35 Exercise 3.35
3.36 Exercise 3.36
3.37 Exercise 3.37
3.38 Exercise 3.38
3.39 Exercise 3.39
3.40 Exercise 3.40
3.41 Exercise 3.41
3.42 Exercise 3.42
3.43 Exercise 3.43
3.44 Exercise 3.44
3.45 Exercise 3.45
3.46 Exercise 3.46
3.47 Exercise 3.47
3.48 Exercise 3.48
3.49 Exercise 3.49
3.50 Exercise 3.50
3.51 Exercise 3.51
3.52 Exercise 3.52
3.53 Exercise 3.53
3.54 Exercise 3.54
3.55 Exercise 3.55
3.56 Exercise 3.56
3.57 Exercise 3.57
3.58 Exercise 3.58
3.59 Exercise 3.59
3.60 Exercise 3.60
3.61 Exercise 3.61
3.62 Exercise 3.62
3.63 Exercise 3.63
3.64 Exercise 3.64
3.65 Exercise 3.65
3.66 Exercise 3.66
3.67 Exercise 3.67
3.68 Exercise 3.68
3.69 Exercise 3.69
3.70 Exercise 3.70
3.71 Exercise 3.71
3.72 Exercise 3.72
3.73 Exercise 3.73
3.74 Exercise 3.74
3.75 Exercise 3.75
3.76 Exercise 3.76
3.77 Exercise 3.77
3.78 Exercise 3.78
3.79 Exercise 3.79
3.80 Exercise 3.80
3.81 Exercise 3.81
3.82 Exercise 3.82

3.31 Exercise 3.31

This is the interactive session that we are expecting to see, with accept-action-procedure immediately running the procedure after adding it ot the list:

> (define input-1 (make-wire))
> (define input-2 (make-wire))
> (define sum (make-wire))
> (define carry (make-wire))
> (probe 'sum sum)

sum 0 New value = 0

> (probe 'carry carry)

carry 0 New value = 0

> (half-adder input-1 input-2 sum carry)

'ok

> (set-signal! input-1 1)

'done

> (propagate)

sum 8 New value = 1

'done

> (set-signal! input-2 1)

'done

> (propagate)

carry 11 New value = 1

sum 16 New value = 0

'done

If we change the definition to not do this, we get this session:

(define (make-wire-bad)
(let ((signal-value 0) (action-procedures '()))
  (define (set-my-signal! new-value)
    (if (not (= signal-value new-value))
        (begin (set! signal-value new-value)
               (call-each action-procedures))
        'done))
 
  (define (accept-action-procedure! proc)
    (set! action-procedures (cons proc action-procedures)))
 
  (define (dispatch m)
    (cond ((eq? m 'get-signal) signal-value)
          ((eq? m 'set-signal!) set-my-signal!)
          ((eq? m 'add-action!) accept-action-procedure!)
          (else (error "Unknown operation -- WIRE" m))))
 
  dispatch))
> (define the-agenda (make-agenda))
> (define input-1 (make-wire-bad))
> (define input-2 (make-wire-bad))
> (define sum (make-wire-bad))
> (define carry (make-wire-bad))
> (probe 'sum sum)
> (probe 'carry carry)
> (half-adder input-1 input-2 sum carry)

'ok

> (set-signal! input-1 1)

'done

> (propagate)

'done

> (set-signal! input-2 1)

'done

> (propagate)

carry 11 New value = 1

'done

Because action procedures are not run after being added to wires, the initial values of the wires are not propagated, meaning that later calculations are not done corrrectly.