;------------ a cps version of reverse. L is an s-list.
;   Convert this code to use data-structure continuations.
;   and then to imperative style (we'll probably cover imperative style in day 37 or 38 class)

(define reverse*-cps
  (lambda (L k)
    (if (null? L)
        (k '())
        (reverse*-cps
         (cdr L)
         (lambda (reversed-cdr)
           (if (pair? (car L))
               (reverse*-cps
                (car L)
                (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)
        (k b)
        (append-cps
         (cdr a)
         b
         (lambda (appended-cdr)
           (k (cons (car a) appended-cdr)))))))

(define init-k
  (lambda (v)
    (display "answer: ") (display v) (newline)))