Exercise 2.22: Louis Reasoner tries to rewrite the first square-list
procedure of exercise 2.21
so that it evolves an iterative process:
(define (square-list items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(cons (square (car things))
answer))))
(iter items nil))
Unfortunately, defining square-list this way produces the answer list in the reverse order of the one desired. Why?
The reason the above works in reverse is because cons
step of iter
, cons puts new elements to the left of list
answer
.
(list 1 2 3)
end up as (list 1)
, (list 2 1)
and finally (list 3 2 1)
.
Louis then tries to fix his bug by interchanging the arguments to cons:
(define (square-list items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(cons answer
(square (car things))))))
(iter items nil))
This doesn’t work either. Explain.
Because (square (car things))
is not a list, cons
creates a dotted pair out of
answer
which is an empty list and a number.
The result looks like this:
> (square-list (list 1 2 3 4))
((((() . 1) . 4) . 9) . 16)