8.6 I/O Patterns

► |  | The Racket Guide

1 | Welcome to Racket
2 | Racket Essentials
3 | Built-In Datatypes
4 | Expressions and Definitions
5 | Programmer-Defined Datatypes
6 | Modules
7 | Contracts
8 | Input and Output
9 | Regular Expressions
10 | Exceptions and Control
11 | Iterations and Comprehensions
12 | Pattern Matching
13 | Classes and Objects
14 | Units
15 | Reflection and Dynamic Evaluation
16 | Macros
17 | Creating Languages
18 | Concurrency and Synchronization
19 | Performance
20 | Parallelism
21 | Running and Creating Executables
22 | More Libraries
23 | Dialects of Racket and Scheme
24 | Command-Line Tools and Your Editor of Choice
| Bibliography
| Index

▼ | 8 | Input and Output

8.1 | Varieties of Ports
8.2 | Default Ports
8.3 | Reading and Writing Racket Data
8.4 | Datatypes and Serialization
8.5 | Bytes, Characters, and Encodings
8.6 | I/ O Patterns

top ← prev up next →

#### 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"

top ← prev up next →