; find the merge point of two lists
(define (merge-point xs ys)
(let loop ((xs (reverse xs)) (ys (reverse ys)) (zs (list)))
(cond ((or (null? xs) (null? ys))
(values (reverse xs) (reverse ys) zs))
((equal? (car xs) (car ys))
(loop (cdr xs) (cdr ys) (cons (car xs) zs)))
(else (values (reverse xs) (reverse ys) zs)))))
(call-with-values
(lambda () (merge-point '(1 2 3 7 8 9) '(4 5 6 7 8 9)))
(lambda (left right merge)
(display left) (newline)
(display right) (newline)
(display merge) (newline)))
(display "-----------------------------------") (newline)
(call-with-values
(lambda () (merge-point '(1 2 3) '(4 5 6)))
(lambda (left right merge)
(display left) (newline)
(display right) (newline)
(display merge) (newline)))
(display "-----------------------------------") (newline)
(call-with-values
(lambda () (merge-point '(3 4 5) '(1 2 3 4 5)))
(lambda (left right merge)
(display left) (newline)
(display right) (newline)
(display merge) (newline)))
(display "-----------------------------------") (newline)
(call-with-values
(lambda () (merge-point '(1 2 3) '(1 2 3)))
(lambda (left right merge)
(display left) (newline)
(display right) (newline)
(display merge) (newline)))