;------------ file 2-cps.ss ------------------
;------------ a cps version of reverse*. -----

(define apply-k (lambda (k v) (k v)))
(define make-k (lambda (k) k))

(define reverse*-cps
  (lambda (L k)
    (if (null? L)
        (apply-k k '())
        (reverse*-cps
         (cdr L)
         (make-k (lambda (reversed-cdr)
		   (if (pair? (car L))
		       (reverse*-cps
			(car L)
			(make-k (lambda (reversed-car)
				  (append-cps reversed-cdr
					      (list reversed-car)
					      k))))
			(append-cps reversed-cdr
				    (list (car L))
				    k))))))))

(define append-cps
  (lambda (a b k)
    (if (null? a)
        (apply-k k b)
        (append-cps
         (cdr a)
         b
         (make-k (lambda (appended-cdr)
		   (apply-k k
			    (cons (car a) appended-cdr))))))))
(define init-k
  (lambda (v)
    (display "answer: ") (display v) (newline)))

(define test
  (lambda (slist)
    (reverse*-cps slist (make-k init-k))))