![]() | 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)))))