(define traverse (letrec ([traverse (lambda (t s) (cond [(null? t) (CONS '() s)] [(integer? t) (let ([m (max t s)]) (CONS m m))] [else (let ([pr (traverse (car t) s)]) (let ([pr-d (traverse (cdr t) (CDR pr))]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d))))]))]) (lambda (t) (CAR (traverse t 0))))) (define test-traverse (lambda () (traverse '((((2 4 (1 5 3) 7 6) 4) 2 4))))) (pretty-print (test-traverse)) (newline) (define unit (lambda (v) (lambda (s) (CONS v s)))) (define unit-max (lambda (v) (lambda (s) (let ([m (max v s)]) (CONS m m))))) (define bind (lambda (m w) (lambda (s) (let ([pr (m s)]) ((w (CAR pr)) (CDR pr)))))) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (bind (traverse (car t)) (lambda (a) (bind (traverse (cdr t)) (lambda (d) (unit (cons a d))))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (bind (traverse (car t)) (lambda (a) (bind (traverse (cdr t)) (lambda (d) ((lambda (v) (lambda (s) (CONS v s))) (cons a d))))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (bind (traverse (car t)) (lambda (a) (bind (traverse (cdr t)) (lambda (d) (lambda (s) (CONS (cons a d) s))))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (bind (traverse (car t)) (lambda (a) ((lambda (m w) (lambda (s) (let ([pr (m s)]) ((w (CAR pr)) (CDR pr))))) (traverse (cdr t)) (lambda (d) (lambda (s) (CONS (cons a d) s))))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (bind (traverse (car t)) (lambda (a) (lambda (s) (let ([pr ((traverse (cdr t)) s)]) (((lambda (d) (lambda (s) (CONS (cons a d) s))) (CAR pr)) (CDR pr))))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (bind (traverse (car t)) (lambda (a) (lambda (s) (let ([pr ((traverse (cdr t)) s)]) ((lambda (s) (CONS (cons a (CAR pr)) s)) (CDR pr))))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (bind (traverse (car t)) (lambda (a) (lambda (s) (let ([pr ((traverse (cdr t)) s)]) (CONS (cons a (CAR pr)) (CDR pr))))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else ((lambda (m w) (lambda (s) (let ([pr (m s)]) ((w (CAR pr)) (CDR pr))))) (traverse (car t)) (lambda (a) (lambda (s) (let ([pr ((traverse (cdr t)) s)]) (CONS (cons a (CAR pr)) (CDR pr))))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (lambda (s) (let ([pr ((traverse (car t)) s)]) (((lambda (a) (lambda (s) (let ([pr ((traverse (cdr t)) s)]) (CONS (cons a (CAR pr)) (CDR pr))))) (CAR pr)) (CDR pr))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (lambda (s) (let ([pr ((traverse (car t)) s)]) ((lambda (s) (let ([pr-d ((traverse (cdr t)) s)]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d)))) (CDR pr))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (unit-max t)] [else (lambda (s) (let ([pr ((traverse (car t)) s)]) (let ([pr-d ((traverse (cdr t)) (CDR pr))]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d)))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) ((lambda (v) (lambda (s) (let ([m (max v s)]) (CONS m m)))) t)] [else (lambda (s) (let ([pr ((traverse (car t)) s)]) (let ([pr-d ((traverse (cdr t)) (CDR pr))]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d)))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (unit '())] [(integer? t) (lambda (s) (let ([m (max t s)]) (CONS m m)))] [else (lambda (s) (let ([pr ((traverse (car t)) s)]) (let ([pr-d ((traverse (cdr t)) (CDR pr))]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d)))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) ((lambda (v) (lambda (s) (CONS v s))) '())] [(integer? t) (lambda (s) (let ([m (max t s)]) (CONS m m)))] [else (lambda (s) (let ([pr ((traverse (car t)) s)]) (let ([pr-d ((traverse (cdr t)) (CDR pr))]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d)))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (cond [(null? t) (lambda (s) (CONS '() s))] [(integer? t) (lambda (s) (let ([m (max t s)]) (CONS m m)))] [else (lambda (s) (let ([pr ((traverse (car t)) s)]) (let ([pr-d ((traverse (cdr t)) (CDR pr))]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d)))))]))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t) (lambda (s) (cond [(null? t) (CONS '() s)] [(integer? t) (let ([m (max t s)]) (CONS m m))] [else (let ([pr ((traverse (car t)) s)]) (let ([pr-d ((traverse (cdr t)) (CDR pr))]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d))))])))]) (lambda (t) (CAR ((traverse t) 0))))) (pretty-print (test-traverse)) (newline) (define traverse (letrec ([traverse (lambda (t s) (cond [(null? t) (CONS '() s)] [(integer? t) (let ([m (max t s)]) (CONS m m))] [else (let ([pr (traverse (car t) s)]) (let ([pr-d (traverse (cdr t) (CDR pr))]) (CONS (cons (CAR pr) (CAR pr-d)) (CDR pr-d))))]))]) (lambda (t) (CAR (traverse t 0))))) (pretty-print (test-traverse)) (newline)