1 (define C (make-connector))
2 (define F (make-connector))
3 (celsius-fahrenheit-converter C F)
5 (define (celsius-fahrenheit-converter c f)
6 (let ((u (make-connector))
19 (has-value? <connector>)
20 (get-value <connector>)
21 (set-value! <connector> <new-value> <informant>)
22 (forget-value! <connector> <retractor>)
23 (connect <connector> <new-constraint>)
25 (define (adder a1 a2 sum)
26 (define (process-new-value)
27 (cond ((and (has-value? a1) (has-value? a2))
29 (+ (get-value a1) (get-value a2))
31 ((and (has-value? a1) (has-value? sum))
33 (- (get-value sum) (get-value a1))
35 ((and (has-value? a2) (has-value? sum))
37 (- (get-value sum) (get-value a2))
39 (define (process-forget-value)
40 (forget-value! sum me)
45 (cond ((eq? request 'I-have-a-value)
47 ((eq? request 'I-lost-my-value)
48 (process-forget-value))
50 (error "Unknown request -- ADDER" request))))
56 (define (inform-about-value constraint)
57 (constraint 'I-have-a-value))
58 (define (inform-about-no-value constraint)
59 (constraint 'I-lost-my-value))
61 (define (multiplier m1 m2 product)
62 (define (process-new-value)
63 (cond ((or (and (has-value? m1) (= (get-value m1) 0))
64 (and (has-value? m2) (= (get-value m2) 0)))
65 (set-value! product 0 me))
66 ((and (has-value? m1) (has-value? m2))
68 (* (get-value m1) (get-value m2))
70 ((and (has-value? product) (has-value? m1))
72 (/ (get-value product) (get-value m1))
74 ((and (has-value? product) (has-value? m2))
76 (/ (get-value product) (get-value m2))
78 (define (process-forget-value)
79 (forget-value! product me)
84 (cond ((eq? request 'I-have-a-value)
86 ((eq? request 'I-lost-my-value)
87 (process-forget-value))
89 (error "Unknown request -- MULTIPLIER" request))))
95 (define (constant value connector)
97 (error "Unknown request -- CONSTANT" request))
98 (connect connector me)
99 (set-value! connector value me)
102 (define (probe name connector)
103 (define (print-probe value)
109 (define (process-new-value)
110 (print-probe (get-value connector)))
111 (define (process-forget-value)
114 (cond ((eq? request 'I-have-a-value)
116 ((eq? request 'I-lost-my-value)
117 (process-forget-value))
119 (error "Unknown request -- PROBE" request))))
120 (connect connector me)
123 (define (make-connector)
124 (let ((value false) (informant false) (constraints '()))
125 (define (set-my-value newval setter)
126 (cond ((not (has-value? me))
128 (set! informant setter)
129 (for-each-except setter
132 ((not (= value newval))
133 (error "Contradiction" (list value newval)))
135 (define (forget-my-value retractor)
136 (if (eq? retractor informant)
137 (begin (set! informant false)
138 (for-each-except retractor
139 inform-about-no-value
142 (define (connect new-constraint)
143 (if (not (memq new-constraint constraints))
145 (cons new-constraint constraints)))
147 (inform-about-value new-constraint))
150 (cond ((eq? request 'has-value?)
151 (if informant true false))
152 ((eq? request 'value) value)
153 ((eq? request 'set-value!) set-my-value)
154 ((eq? request 'forget) forget-my-value)
155 ((eq? request 'connect) connect)
156 (else (error "Unknown operation -- CONNECTOR"
160 (define (for-each-except exception procedure list)
162 (cond ((null? items) 'done)
163 ((eq? (car items) exception) (loop (cdr items)))
164 (else (procedure (car items))
165 (loop (cdr items)))))
168 (define (has-value? connector)
169 (connector 'has-value?))
170 (define (get-value connector)
172 (define (set-value! connector new-value informant)
173 ((connector 'set-value!) new-value informant))
174 (define (forget-value! connector retractor)
175 ((connector 'forget) retractor))
176 (define (connect connector new-constraint)
177 ((connector 'connect) new-constraint))