#!/usr/bin/racket
#lang scheme

(define (trace xs msg)
        (display xs)
        (display " in ")
        (display msg)
        (newline))

(define (reverse items)
        (trace items "reverse")
        (define (iter xs result)
                (if (null? xs)
                        result
                        (iter (cdr xs) (cons (car xs) result))))
        (iter items '()))

(define (deep-reverse items)
        (trace items "deep-reverse")
        (if (not (pair? items))
                items
                (reverse (map deep-reverse items))))

; ((1 2) (3 4))
(define x (list (list 1 2) (list 3 4)))

;(display x)
;(newline)

;(display (reverse x))
;(newline)

; (deep-reverse ((1 2) (3 4)) )
; (reverse ( '( ((reverse (deep-reverse '(1 2))) (reverse (deep-reverse '(3 4))) ))
; (reverse ( '( (reverse '((deep-reverse 1) (deep-reverse 2)) (reverse '((deep-reverse 3) (deep-reverse 4))))))
; (reverse ( '( (reverse '(1 2)) (reverse '(3 4)))))
; (reverse ( '( (2 1) (4 3) )))
; ((4 3) (1 2))

(display (deep-reverse x))
(newline)
