;; ,open threads rendezvous rendezvous-channels (define (display-message-rv rv ack-message nack-message) (with-nack (lambda (nack) (spawn (lambda () (sync nack) (display nack-message) (newline))) (wrap rv (lambda (ignore) (display ack-message) (newline)))))) (define (numbers n) (let lp ((n n) (lst '())) (if (zero? n) lst (lp (- n 1) (cons n lst))))) (define (make-channel-list n) (map (lambda (n) (cons n (make-channel))) (numbers n))) (define (ack-message n) (string-append "ack " (number->string n))) (define (nack-message n) (string-append "nack " (number->string n))) (define (wait-for-data channels) (spawn (lambda () (let lp () (apply select (map (lambda (n.ch) (display-message-rv (receive-rv (cdr n.ch)) (ack-message (car n.ch)) (nack-message (car n.ch)))) channels)) (lp)))))