I did finally got around to responding to Cartesian Product thread though, and I think my solution turned out pretty nice.
While I completely agree with your assessment, you are returning the tree, not the list:
guile> (cartesian-product '(1 2 3) '(4 5 6) '(7 8 9))
((((1 4 7) (1 4 8) (1 4 9)) ((1 5 7) (1 5 8) (1 5 9)) ((1 6 7) (1 6 8) (1 6 9))) (((2 4 7) (2 4 8) (2 4 9)) ((2 5 7) (2 5 8) (2 5 9)) ((2 6 7) (2 6 8) (2 6 9))) (((3 4 7) (3 4 8) (3 4 9)) ((3 5 7) (3 5 8) (3 5 9)) ((3 6 7) (3 6 8) (3 6 9))))
and this is your call pattern:
(define (cartesian-product . An)
(let cartesian-product-iter
((values (lambda (x) x)) (An An))
(simple-format #t "c-p-i ~A" An)
(newline)
(if (null? An)
(values '())
(map
(lambda (x)
(cartesian-product-iter
(lambda (y) (values (cons x y)))
(cdr An)))
(car An)))))
guile> (cartesian-product '(1 2 3) '(4 5 6) '(7 8 9))
c-p-i ((1 2 3) (4 5 6) (7 8 9))
c-p-i ((4 5 6) (7 8 9))
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()
c-p-i ((4 5 6) (7 8 9))
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()
c-p-i ((4 5 6) (7 8 9))
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()
c-p-i ((7 8 9))
c-p-i ()
c-p-i ()
c-p-i ()