# SRFI 2 - `and-let*`

The `(srfi 2)` library provides the `and-let*` macro, an `and` with local bindings. 

Like an ordinary `and`, an `and-let*` special form evaluates its arguments -- expressions -- one after another in order, till the first one that yields `#f`. Unlike `and`, however, a non-#f result of one expression can be bound to a fresh variable and used in the subsequent expressions. `and-let*` is a cross-breed between `let*` and `and`.

See the [SRFI document](http://srfi.schemers.org/srfi-2/srfi-2.html) for more information.

- [`and-let*`](#and-let)

#and-let*
    (and-let* (claws) body

    claws ::= '() | (cons claw claws)
    claw  ::=  (variable expression) | (expression) |
               bound-variable

- The `claws` are evaluated in the strict left-to-right order
- For each `claw`, the `expression` part is evaluated first (or `bound-variable` is looked up)
- If the result is #f, `and-let*` immediately returns #f
- Otherwise, if the `claw` is of the form `(variable expression)` the `expression`'s value is bound to a freshly made `variable`
- The `variable` is available for the rest of the `claws` , and the `body`
- As usual, all `variable`s must be unique (like in `let*`)