;--- 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)))