Он работает только для двух элементов в списке два, потому что вы указали его только для двух элементов в списке два. Нам нужно использовать силу абстракции.
Если бы мы работали на императивных языках, то для этой проблемы мы использовали бы вложенные циклы for. Вы начинаете с первого элемента alist1 и сопоставляете его со всеми элементами alist2. Затем вы переходите ко второму элементу alist1 и сопоставляете его со всеми элементами alist2. Поскольку мы работаем на функциональном языке (схема), мы будем использовать вложенные функции вместо вложенных циклов for.
Вы хотите написать функцию, которая принимает 'a и' (1 2 3) и производит '(a 1 a 2 a 3), а затем другую функцию для вызова первой с различными значениями' a. Соответствующий код, который вы должны игнорировать, если не хотите, чтобы решение было испорчено для вас ниже.
(define (cross alist1 alist2)
(cond
((null? alist1) '())
(else
(append (innercross (car alist1) alist2)
(cross (cdr alist1) alist2)))))
(define (innercross a1 alist2)
(cond
((null? alist2) '())
(else
(cons a1 (cons (car alist2) (innercross a1 (cdr alist2)))))))