sorawee
2018-12-29 05:10:02

Is there anyway to make merge-input respect the order? For instance, I have:

;; a.rkt
#lang racket/base

(printf "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n")
(eprintf "BBB\n")

and

;; b.rkt
#lang racket/base

(require racket/match
         racket/system
         racket/port)

(match-define (list out in _ err proc) (process "racket a.rkt"))

(proc 'wait)

(define new-port (merge-input out err))

(let iter ()
  (match (read-line new-port)
    [(? string? s) (displayln s)
                   (iter)]
    [else (void)]))

(close-input-port out)
(close-input-port err)
(close-output-port in)

Running a.rkt directly always yield the right order (AAA... and then BBB), but running b.rkt almost always gives the wrong order. I could switch (merge-input out err) to (merge-input err out) to make the order different, but it’s still wrong for a more complicated program.