#### `and` and `or`

The special forms `and` and `or` can be used as logical operators, but they can also be used as control structures, which is why they are special forms.

`and` takes any number of expressions, and evaluates them in sequence, until one of them returns `#f` or all of them have been evaluated. At the point where one returns `#f`, `and` returns that value as the value of the `and` expression. If none of them returns `#f`, it returns the value of the last subexpression.

This is really a control construct, not just a logical operator, because whether subexpressions get evaluated depends on the reults of the previous subexpressions.

`and` is often used to express both control flow and value returning, like a sequence of `if` tests. You can write something like

```(and (try-first-thing)
(try-second-thing)
(try-third-thing))
```

If the three calls all return true values, `and` returns the value of the last one. If any of them returns `#f`, however, none of the rest are evaluated, and `#f` is returned as the value of the overall expression.

Likewise, `or` takes any number of arguments, and returns the value of the first one that returns a true value (i.e., anything but `#f`). It stops when it gets a true value, and returns it without evaluating the remaining subexpressions.

```(or (try-first-thing)
(try-second-thing)
(try-third-thing))
```

`or` keeps trying subexpressions until one of them does return a true value; if that happens, `or` stops and returns that value. If none of them returns anything but `#f`, it returns `#f`.

```==================================================================
This is the end of Hunk A.

TIME TO TRY IT OUT

At this point, you should go read Hunk B of the next chapter
and work through the examples using a running Scheme system.
Then return here and resume this chapter.
==================================================================
```

(Go to Hunk B, which starts at section An Interactive Programming Environment (Hunk B).)