;--- file 4-reverse-transform-to-imperative.ss -------------------
; mostly transformed but not working

(load "chez-init.ss")
(define any? (lambda (x) #t))

(define-datatype continuation continuation?
  [append-k
   (a any?)
   (k continuation?)]
  [init-k]
  [rev1-k
   (L any?)
   (k continuation?)]
  [rev2-k
   (reversed-cdr (list-of any?))
   (k continuation?)])

(define L)
(define k)
(define a)
(define b)
(define v)


(define reverse*-cps
  (lambda ()
    (if (null? L)
        (begin (set! v '()) 
	       (apply-k))
        (begin (set! k (rev1-k (car L) k))
	       (set! L (cdr L))
	       (reverse*-cps)))))

(define append-cps
  (lambda ()
    (if (null? a)
        (begin (set! v b)
	       (apply-k))
	(begin (set! k (append-k a k))
	       (set! a (cdr a))
	       (append-cps)))))


(define apply-k
  (lambda ()
    (cases  continuation k
      [init-k ()
           (printf "answer: ~s~n" v)]
      [append-k (a k1)
	(set! v (cons (car a) v))
	(set! k k1)
        (apply-k)]
      [rev1-k (L k1)
        (if (pair? (car L))
	    (begin (set! L (car L)) 
		   (set! k (rev2-k v k1))
		   (reverse*-cps))
	    (begin (set! a v)
		   (set! b (list (car L)))
		   (set! k k1)
		   (append-cps)))]
      [rev2-k (reversed-cdr k1)
	      (set! a reversed-cdr)
	      (set! b (list v))
	      (set! k k1)
              (append-cps)])))

(define trace-all
  (lambda ()
    (trace reverse*-cps append-cps apply-k init-k rev1-k rev2-k append-k)))

(define r
  (lambda ()
    (display "enter an s-expression: ")
    (set! L (read))
    (set! k (init-k))
    (reverse*-cps)))