fork(1) download
  1. ; double and increment
  2.  
  3. (define (make-queue) (list (list)))
  4.  
  5. (define (enqueue q x) (cons (car q) (cons x (cdr q))))
  6.  
  7. (define (head q)
  8. (if (pair? (car q))
  9. (caar q)
  10. (if (pair? (cdr q))
  11. (car (reverse (cdr q)))
  12. (error 'head "empty"))))
  13.  
  14. (define (tail q)
  15. (if (pair? (car q))
  16. (cons (cdar q) (cdr q))
  17. (if (pair? (cdr q))
  18. (cons (cdr (reverse (cdr q))) (list))
  19. (error 'tail "empty"))))
  20.  
  21. (define (f a b)
  22. (let loop ((q (enqueue (make-queue) (list (list a b)))))
  23. (let ((p (head q)) (q (tail q)))
  24. (cond ((= (caar p) (cadar p)) (reverse p))
  25. (else (let ((t (enqueue q (cons (list (+ 1 (caar p)) (* 2 (cadar p))) p))))
  26. (loop (enqueue t (cons (list (* 2 (caar p)) (+ 1 (cadar p))) p)))))))))
  27.  
  28. (display (f 1 8)) (newline)
Success #stdin #stdout 0.03s 8148KB
stdin
Standard input is empty
stdout
((1 8) (2 9) (4 10) (5 20) (10 21) (11 42) (22 43) (44 44))