**Exercise 2.4:** Here is an alternative procedural representation of pairs. For this representation, verify that
`(car (cons x y))`

yields `x`

for any objects `x`

and `y`

.

```
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
```

What is the corresponding definition of `cdr`

? (Hint: To verify that this works, make use of the substitution
model of section 1.1.5.)

```
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
(define (cdr z)
(z (lambda (p q) q)))
```

```
> (car (cons 1 2))
1
> (cdr (cons 1 2))
2
```

The reason this works is because upon execution of `cons`

the function that is returned is used in a clever way by
`car`

and `cons`

. `Car`

and `cdr`

pass a function via the `m`

parameter in the `cons`

. That function then
receives as arguments `x`

and `y`

. In the case of `cdr`

the second parameter is returned. The thing to note is that
`x`

and `y`

get stored in the lambda function when the cons procedure is called.

```
(car (cons 1 2))
(car (lambda (m) (m 1 2)))
((lambda (m) (m 1 2)) (lambda (p q) p))
((lambda (p q) p) 1 2)
(lambda (1 2) 1)
1
```