(define read-string (lambda (ip) (unless (eqv? (read-char ip) #\") (error 'read-string "no starting double-quote")) (list->string (let f () (let ([c (read-char ip)]) (cond [(eqv? c #\") '()] [(or (eqv? c #\newline) (eof-object? c)) (error 'read-string "no ending double-quote")] [else (cons c (f))])))))) (define readrol (lambda (ip) (let ([c (read-char ip)]) (if (eq? c #\newline) '() (cons c (readrol ip)))))) (define read-line (lambda (ip) (if (eof-object? (peek-char ip)) (peek-char ip) (let ([x (read-string ip)]) (cons x (readrol ip)))))) (define summary-read (lambda (ip) (do ([ls '() (cons line ls)] [line (read-line ip) (read-line ip)]) ((eof-object? line) (reverse! ls))))) (define summary-sort (lambda (x) (sort! (lambda (x y) (string