Back to slide -- Keyboard shortcut: 'u'  previous -- Keyboard shortcut: 'p'                all.scm - Tree stuff, traversal, and controller - in one file.Lecture 3 - slide 40 : 43
Program 4

; ALL PARTS TOGETHER IN ONE FILE - VERY LITTLE NEW STUFF HERE.

; Binary tree stuff:
(define (make-tree left-tree root-node right-tree)
   (list left-tree root-node right-tree))
(define (leaf root-node) (make-tree '() root-node '()))
(define root cadr)
(define left-tree car)
(define right-tree caddr)
(define inner-node? pair?)
(define leaf? number?)
(define empty-tree? null?)

(define (print-node n) (write n) (newline))
(define (TRAV tree)
  (cond ((empty-tree? tree) )
        ((inner-node? tree) 
            (TRAV (left-tree tree))
            (print-node (root tree))
            (TRAV (right-tree tree)))
        ((leaf? tree)
            (print-node (root tree)))
        (else (error "Should not happen"))))

(define tr1 (make-tree (make-tree
                            (leaf 2)
                            4
                            (leaf 3))
                       7
                       (make-tree
                            (make-tree '() 0 (leaf 9))
                            1
                            (leaf 5))))

(define tr2 (make-tree (make-tree
                            (make-tree '() 1 (leaf 9))
                            0
                            (leaf 7))
                       8
                       (make-tree
                            (make-tree (leaf 2) 7 '())
                            6
                            (leaf 1))))

(define (traverse-start tree controller-cont)
  (let ((cont (traverse tree controller-cont)))
    (cont (cons #f 'no-continuation))  ; end of traversal value, passed back to controller.
  ))

; Traverse tree, and send every node encountered to controller-cont.
; Returns a controller continuation.
(define (traverse tree controller-cont)
  (cond ((empty-tree? tree) controller-cont)
        ((inner-node? tree) 
            (let ((new-controller-cont (traverse (left-tree tree) controller-cont)))
              (let ((new-controller-cont (handle-node (root tree) new-controller-cont)))
                (let ((new-controller-cont (traverse (right-tree tree) new-controller-cont)))
                   new-controller-cont))))
        ((leaf? tree)
            (handle-node (root tree) controller-cont))
        (else (error "Should not happen")))
)

; Send n, together with a continuation, to controller-cont.
; Receive a new controller continuation, which is returned by handle-node.
(define (handle-node n controller-cont) 
  (call-with-current-continuation 
    (lambda (here)
       (controller-cont (cons n here)))))

(define (end-traversal? x y)
  (or (and (pair? x) (not (car x)))
      (and (pair? y) (not (car y))) ))

(define (traverse-controller tr1 tr2)
  (let ((tr1-point (call-with-current-continuation (lambda (here) (traverse-start tr1 here))))
        (tr2-point (call-with-current-continuation (lambda (here) (traverse-start tr2 here)))))
    (letrec ((tree-2-stepper 
              (lambda (tr1-point tr2-point)  ; tr1-point and tr2-point are each a pair:
                                             ; (tree-node . traversal-cont)
                (if (end-traversal? tr1-point tr2-point) 
                    '()
                    (let ((n1 (car tr1-point))
                          (c1 (cdr tr1-point))
                          (n2 (car tr2-point))
                          (c2 (cdr tr2-point)))
                       (cons (cons n1 n2)
                          (let ((tr1nh (call-with-current-continuation
                                         (lambda (here) (c1 here))))
                                (tr2nh (call-with-current-continuation
                                         (lambda (here) (c2 here)))))
                            (tree-2-stepper tr1nh tr2nh ))))))))
       (tree-2-stepper tr1-point tr2-point ))))

; (traverse-controller tr1 tr2) =>
; ((2 . 1) (4 . 9) (3 . 0) (7 . 7) (0 . 8) (9 . 2) (1 . 7)   (5 . 6))