;; Swap-Channels (define-record-type :swap-channel (really-make-swap-channel channel) swap-channel? (channel swap-channel-channel)) (define (make-swap-channel) (really-make-swap-channel (make-channel))) (define (swap-rv swap-channel message-out) (let ((channel (swap-channel-channel swap-channel))) (guard (lambda () (let ((in-channel (make-channel))) (choose (wrap (receive-rv channel) (lambda (pair) (let ((message-in (car pair)) (out-channel (cdr pair))) (send out-channel message-out) message-in))) (wrap (send-rv channel (cons message-out in-channel)) (lambda (ignore) (receive in-channel))))))))) (define (make-const-reply x ch) (let ((rv (swap-rv ch x))) (let lp () (display (sync rv)) (newline) (lp)))) (define c1 (make-swap-channel)) (spawn (lambda () (make-const-reply 42 c1))) (spawn (lambda () (make-const-reply 67 c1)))