;; -- reverse.scm -- (in class) ;; ;; (1 2 3) is (cons 1 (cons 2 (cons 3 '()))) ;; (3 2 1) is (cons 3 (cons 2 (cons 1 '()))) ;; ;; -- steps to turn one to the other -- ;; ;; original reverse ;; ------------------------------ ----------------------------- ;; (cons 1 (cons 2 (cons 3 '()))) '() ;; (cons 2 (cons 3 '())) (cons 1 '()) ;; (cons 3 '()) (cons 2 (cons 1 '())) ;; '() (cons 3 (cons 2 (cons 1 '())) ;; ;; (define (reverse items) (define (reverse-iter original backwards) (printf " debug: (reverse-iter ~a ~a)\n" original backwards) (if (null? original) backwards (let ((new-original (cdr original)) (new-backwards (cons (car original) backwards))) (reverse-iter new-original new-backwards)))) (reverse-iter items '())) (define testcase (list 1 2 3 4)) (printf "testcase is ~a\n" testcase) (printf "(reverse testcase) is ~a\n" (reverse testcase)) ; $ scheme reverse.scm ; testcase is (1 2 3 4) ; debug: (reverse-iter (1 2 3 4) ()) ; debug: (reverse-iter (2 3 4) (1)) ; debug: (reverse-iter (3 4) (2 1)) ; debug: (reverse-iter (4) (3 2 1)) ; debug: (reverse-iter () (4 3 2 1)) ; (reverse testcase) is (4 3 2 1)