(define (do-message type data) (let ((tag (next-tag))) (call/cc (lambda (return) (set! tag-cc (append tag-cc (list (cons tag return)))) (9p:send-message outport (make-9p:message type tag data)) (let* ((a (9p:receive-message inport)) (rtag (9p:message-tag a)) (ret (alist-ref rtag tag-cc))) (if ret (begin (set! tag-cc (alist-remove rtag tag-cc)) (ret a)) #f))))))