8.6 I/O Patterns

If you want to process individual lines of a file, then you can use for with in-lines:

  > (define (upcase-all in)
      (for ([l (in-lines in)])
        (display (string-upcase l))
        (newline)))
  > (upcase-all (open-input-string
                 (string-append
                  "Hello, World!\n"
                  "Can you hear me, now?")))

  HELLO, WORLD!

  CAN YOU HEAR ME, NOW?

If you want to determine whether “hello” appears in a file, then you could search separate lines, but it’s even easier to simply apply a regular expression (see Regular Expressions) to the stream:

  > (define (has-hello? in)
      (regexp-match? #rx"hello" in))
  > (has-hello? (open-input-string "hello"))

  #t

  > (has-hello? (open-input-string "goodbye"))

  #f

If you want to copy one port into another, use copy-port from racket/port, which efficiently transfers large blocks when lots of data is available, but also transfers small blocks immediately if that’s all that is available:

  > (define o (open-output-string))
  > (copy-port (open-input-string "broom") o)
  > (get-output-string o)

  "broom"