3.3.1. Mutable List Structure
Exercise 3.12

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

Nobody's finished this exercise yet. You'll be the first!