Есть задача. Надо сравнить два дерева. Причём деревья большие. Поэтому, если не равны, то алгоритм должен прерываться на первом несовпавшем элементе, копировать (преобразовывать) их тоже нельзя.
Реализация на Scheme:
(define (walk-tree fn tree)
(if (cons? tree)
(begin
(walk-tree fn (car tree))
(walk-tree fn (cdr tree)))
(fn tree)))
(define (compare-trees tree1 tree2)
(call/cc
(lambda (return)
(define caller #f)
(define (yield-cont)
(walk-tree proc1 tree1)
(caller #f))
(define (yield)
(call/cc
(lambda (k)
(set! caller k)
(yield-cont))))
(define (proc1 x)
(call/cc
(lambda (continue)
(set! yield-cont (lambda () (continue #f)))
(caller x))))
(define (proc2 x)
(unless (eqv? x (yield))
(return #f)))
(walk-tree proc2 tree2)
(return (eq? (yield) #f)))))
Как написать такое без продолжений? Можно на Scheme/Java/C++/чём угодно.