Мне кажется, я вижу твою проблему. Есть два способа добавить элемент в список.
Первый способ - добавить его:
(define (intersect list1 list2)
(define newlist list2)
(do ((iter1 list1 (cdr iter1)))
(not (null? iter1))
(if (not (member (car iter1) newlist))
(set! newlist (cons (car iter1) newlist)))))
(Вам, вероятно, придется поискать определение do
, если вы действительно хотите использовать это.)
Вы можете заметить, что это довольно некрасиво. Это потому, что на самом деле никто так не делает. Вместо этого вы должны понимать, что вызов функции также создает новую переменную. Попробуйте это:
(define (intersect list1 list2)
(cond ((null? list1) list2)
((member (car list1) list2) (intersect (cdr list1) list2))
(else (intersect (cdr list1) (cons (car list1) list2)))))
Если вы знакомы с алгоритмами, вы заметите, что код, который я только что написал, довольно медленный, но он иллюстрирует смысл: в каждом случае вы выполняете небольшую работу и затем снова вызываете свою функцию. Если вам сложно понять, почему это работает, вместо этого запустите эту функцию на своем примере:
(define (intersect list1 list2)
(display list1) (display " ") (display list2) (newline)
(cond ((null? list1) list2)
((member (car list1) list2) (intersect (cdr list1) list2))
(else (intersect (cdr list1) (cons (car list1) list2)))))