# Streams

## Overview

This problem set introduces streams, which are like lists but where the cdr of a stream is a procedural “promise” to evaluate something later, when it is needed.

Before doing this problem set, read the following material:

## Part 1: Environment Problems

First, some problems on the environment model and mutation. Read Section 3, 3.1, and 3.2.

Problem 1: Exercise 3.1 on pp. 224. After writing and testing the code, draw the environment diagram that would result from evaluating the three statements in the exercise.

Problem 2: Exercise 3.2 on pp. 224-225. After writing and testing the code, draw the environment diagram that would result from evaluating the three statements in the exercise.

Problem 3: Exercise 3.3 on pp. 225, creating a password-protected bank account.

Problem 4: Exercise 3.4 on pp. 225, modifying it to keep track of incorrect password accesses.

## Part 2: Now, the streams stuff.

Problem 5: Use `stream-map` (pp. 320 of textbook) to define a procedure called ` convert-temps` that takes a stream of temperatures in Fahrenheit and returns a stream of converted temperatures in Celsius. Recall that to convert Fahrenheit to Celsius, the equation is C = 5/9 * (F-32).

Problem 6: Use `stream-filter` (pp. 322 of textbook) to define the stream of all integers that are evenly divisible by 2, 3, or 5.

Problem 7: Complete the following alternative definition of the integers stream:

``` (define integers (cons-stream 1 (stream-map <??> integers)))
```

Problem 8: Exercise 3.51 on pp. 325, examining the delayed evaluation by printing results as they are computed.

Problem 9: Exercise 3.52 on pp. 325–326, delayed evaluation while state is changing.

Problem 10: Exercise 3.53 on pp. 330, thinking about how streams defined in terms of themselves operate.

Problem 11: Exercise 3.54 on pp. 331, implementing factorial with `mul-streams`, analogous to how Fibonacci is done in the text.

Problem 12: Exercise 3.57 on pp. 332, understanding memo-ization as it applies to the Fibonacci computation.

Turn in all of the above using `submit fredm 301-ps9 <your file.rkt>`.