- make-connectorprocedure
Makes a connector.
(define (make-connector) (let ((value #f) (informant #f) (constraints '())) (define (set-my-value newval setter) (cond ((not (has-value? me)) (set! value newval) (set! informant setter) (for-each-except setter inform-about-value constraints)) ((not (= value newval)) (error "Contradiction" (list value newval))) (else 'ignored))) (define (forget-my-value retractor) (if (eq? retractor informant) (begin (set! informant #f) (for-each-except retractor inform-about-no-value constraints)) 'ignored)) (define (connect new-constraint) (if (not (memq new-constraint constraints)) (set! constraints (cons new-constraint constraints))) (if (has-value? me) (inform-about-value new-constraint)) 'done) (define (me request) (case request ((has-value?) (and informant #t)) ((value) value) ((set-value!) set-my-value) ((forget) forget-my-value) ((connect) connect) (else (error "Unknown operation: CONNECTOR" request)))) me))