2.22¶
; Louis Reasoner tries to rewrite the first square-list procedure of ; Exercise 2.21 so that it evolves an iterative process: (define nil '()) (define (square-list items) (define (iter things answer) (if (null? things) answer (iter (cdr things) (cons (square (car things)) answer)))) (iter items nil)) (square-list (list 1 2 3 4)) ; (16 9 4 1) ; Unfortunately, defining square-list this way produces the answer list ; in the reverse order of the one desired. Why? 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)) (square-list (list 1 2 3 4)) ; ((((() . 1) . 4) . 9) . 16) ; This doesn’t work either. Explain. ; ==================================== ; Answer ; ==================================== ; (i) Prints in reverse order ; => Let's traverse with (1 2 3 4) ; round things answer ; 1 (1 2 3 4) () ; (2 3 4) (cons (square 1) ()) ; (2 3 4) (1) ; 2 (3 4) (cons (square 2) (1)) ; (3 4) (cons 4 (1)) ; (3 4) (4 1) ; 3 (4) (cons (square 3) (4 1)) ; (4) (9 4 1) ; 4 () (16 9 4 1) ; (ii) Prints nested structures ; round things answer ; 1 (1 2 3 4) () ; (2 3 4) (cons () (square 1)) ; (2 3 4) (cons () 1) ; (2 3 4) (() . 1) ; 2 (3 4) (cons (() . 1) (square 2)) ; (3 4) ((() . 1) . 4) ; ... ... ; ((((() . 1) . 4) . 9) . 16) ; To fix this, we must append two lists instead of `cons`