#
Appending lists
^{
}

The following procedure for appending lists was introduced in section 2.2.1 :

```
(define (append x y)
(if (null? x)
y
(cons (car x) (append (cdr x) y))))
```

`Append`

forms a new list by successively consing the elements of
`x`

onto
`y`

. The procedure
`append!`

is similar to
`append`

, but it is a mutator rather than a constructor. It appends the lists by splicing them together, modifying the final pair of
`x`

so that its
`cdr`

is now
`y`

. (It is an error to call
` append!`

with an empty
`x`

.)

```
(define (append! x y)
(set-cdr! (last-pair x) y)
x)
```

Here
`last-pair`

is a procedure that returns the last pair in its argument:

```
(define (last-pair x)
(if (null? (cdr x))
x
(last-pair (cdr x))))
```

Consider the interaction

```
(define x (list 'a 'b))
(define y (list 'c 'd))
(define z (append x y))
z
```*(a b c d)*
(cdr x)
<response>
(define w (append! x y))
w
*(a b c d)*
(cdr x)
<response>

What are the missing
`<response>`

s? Draw box-and-pointer diagrams to explain your answer.