; double and increment
(define (make-queue) (list (list)))
(define (enqueue q x) (cons (car q) (cons x (cdr q))))
(define (head q)
(if (pair? (car q))
(caar q)
(if (pair? (cdr q))
(car (reverse (cdr q)))
(error 'head "empty"))))
(define (tail q)
(if (pair? (car q))
(cons (cdar q) (cdr q))
(if (pair? (cdr q))
(cons (cdr (reverse (cdr q))) (list))
(error 'tail "empty"))))
(define (f a b)
(let loop ((q (enqueue (make-queue) (list (list a b)))))
(let ((p (head q)) (q (tail q)))
(cond ((= (caar p) (cadar p)) (reverse p))
(else (let ((t (enqueue q (cons (list (+ 1 (caar p)) (* 2 (cadar p))) p))))
(loop (enqueue t (cons (list (* 2 (caar p)) (+ 1 (cadar p))) p)))))))))
(display (f 1 8)) (newline)
OyBkb3VibGUgYW5kIGluY3JlbWVudAoKKGRlZmluZSAobWFrZS1xdWV1ZSkgKGxpc3QgKGxpc3QpKSkKCihkZWZpbmUgKGVucXVldWUgcSB4KSAoY29ucyAoY2FyIHEpIChjb25zIHggKGNkciBxKSkpKQoKKGRlZmluZSAoaGVhZCBxKQogIChpZiAocGFpcj8gKGNhciBxKSkKICAgICAgKGNhYXIgcSkKICAgICAgKGlmIChwYWlyPyAoY2RyIHEpKQogICAgICAgICAgKGNhciAocmV2ZXJzZSAoY2RyIHEpKSkKICAgICAgICAgIChlcnJvciAnaGVhZCAiZW1wdHkiKSkpKQoKKGRlZmluZSAodGFpbCBxKQogIChpZiAocGFpcj8gKGNhciBxKSkKICAgICAgKGNvbnMgKGNkYXIgcSkgKGNkciBxKSkKICAgICAgKGlmIChwYWlyPyAoY2RyIHEpKQogICAgICAgICAgKGNvbnMgKGNkciAocmV2ZXJzZSAoY2RyIHEpKSkgKGxpc3QpKQogICAgICAgICAgKGVycm9yICd0YWlsICJlbXB0eSIpKSkpCgooZGVmaW5lIChmIGEgYikKICAobGV0IGxvb3AgKChxIChlbnF1ZXVlIChtYWtlLXF1ZXVlKSAobGlzdCAobGlzdCBhIGIpKSkpKQogICAgKGxldCAoKHAgKGhlYWQgcSkpIChxICh0YWlsIHEpKSkKICAgICAgKGNvbmQgKCg9IChjYWFyIHApIChjYWRhciBwKSkgKHJldmVyc2UgcCkpCiAgICAgIChlbHNlIChsZXQgKCh0IChlbnF1ZXVlIHEgKGNvbnMgKGxpc3QgKCsgMSAoY2FhciBwKSkgKCogMiAoY2FkYXIgcCkpKSBwKSkpKQogICAgICAgICAgICAgIChsb29wIChlbnF1ZXVlIHQgKGNvbnMgKGxpc3QgKCogMiAoY2FhciBwKSkgKCsgMSAoY2FkYXIgcCkpKSBwKSkpKSkpKSkpCgooZGlzcGxheSAoZiAxIDgpKSAobmV3bGluZSk=