Here follows two slightly different solutions. The first without reduce.
(define (cartesian-product set-list-1 set-list-2)
(apply
append
(map (lambda (b)
(map (lambda (a) (cons a b)) set-list-1))
set-list-2)))
(define (cartesian-product set-list-1 set-list-2)
(reduce-right
append
(map (lambda (b)
(map (lambda (a) (cons a b)) set-list-1))
set-list-2)))
(define (reduce-right f lst)
(if (null? (cdr lst))
(car lst)
(f (car lst)
(reduce-right f (cdr lst)))))
The first solution comes from Christian Wagenknecht's book 'Programmierparadigmen', from Springer Verlag.