Back to lecture notes -- Keyboard shortcut: 'u'                      Lecture 3 - slide 40 : 43
 

; TREE TRAVERSAL STUFF:

; Function that initiates a tree traveral.
; When done, handle an 'end of traversal' value to the controller.
(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"))) )

; Function that handles nodes (internal as well as leafs).
; Send the node value n, together with a continuation, to controller-cont.
; In turn, 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)))))