fork download
  1. ; find the merge point of two lists
  2.  
  3. (define (merge-point xs ys)
  4. (let loop ((xs (reverse xs)) (ys (reverse ys)) (zs (list)))
  5. (cond ((or (null? xs) (null? ys))
  6. (values (reverse xs) (reverse ys) zs))
  7. ((equal? (car xs) (car ys))
  8. (loop (cdr xs) (cdr ys) (cons (car xs) zs)))
  9. (else (values (reverse xs) (reverse ys) zs)))))
  10.  
  11. (call-with-values
  12. (lambda () (merge-point '(1 2 3 7 8 9) '(4 5 6 7 8 9)))
  13. (lambda (left right merge)
  14. (display left) (newline)
  15. (display right) (newline)
  16. (display merge) (newline)))
  17.  
  18. (display "-----------------------------------") (newline)
  19.  
  20. (call-with-values
  21. (lambda () (merge-point '(1 2 3) '(4 5 6)))
  22. (lambda (left right merge)
  23. (display left) (newline)
  24. (display right) (newline)
  25. (display merge) (newline)))
  26.  
  27. (display "-----------------------------------") (newline)
  28.  
  29. (call-with-values
  30. (lambda () (merge-point '(3 4 5) '(1 2 3 4 5)))
  31. (lambda (left right merge)
  32. (display left) (newline)
  33. (display right) (newline)
  34. (display merge) (newline)))
  35.  
  36. (display "-----------------------------------") (newline)
  37.  
  38. (call-with-values
  39. (lambda () (merge-point '(1 2 3) '(1 2 3)))
  40. (lambda (left right merge)
  41. (display left) (newline)
  42. (display right) (newline)
  43. (display merge) (newline)))
Success #stdin #stdout 0.01s 8672KB
stdin
Standard input is empty
stdout
(1 2 3)
(4 5 6)
(7 8 9)
-----------------------------------
(1 2 3)
(4 5 6)
()
-----------------------------------
()
(1 2)
(3 4 5)
-----------------------------------
()
()
(1 2 3)