Я писал программу в Lisp, чтобы поместить общие элементы из двух списков в новую. Вот мой код.В списке, как я могу внести изменения в список через функцию, которая принимает список в качестве параметра?
(defun test (a b)
(let ((alist nil) (blist nil))
(progn
(join a b alist blist)
(print blist))))
(defun join (a b alist blist)
(cond
((and (null a) (null b))
(setf blist (cons alist blist)))
((equal (car a) (car b))
(setf alist (cons (list (car a) (car b)) alist)))
(t (join (cdr a) (cdr b) alist blist))))
Но выход функции всегда nil
. Затем я искал что-то в Интернете и узнал, что, когда я пытаюсь использовать setf
, он больше не указывает на исходный список, вместо этого он указывает на новый. Так что, если я не могу использовать setf
, что еще я могу использовать для его реализации?
Я не уверен, что ваша функция действительно должна делать. Вы хотите, чтобы ваш результат содержал элементы, которые находятся в одной позиции в двух входных списках, или вы хотите какое-то пересечение? Если последний, а как насчет дубликатов? – danlei
Я согласен с даниэлем - это запутанная функция. Можете ли вы привести несколько примеров вызовов функций и ожидаемого вывода? Кроме того, если функция объединяет два списка вместе, почему это принимает четыре аргумента? – zck
, вы всегда должны использовать правильный отступ Lisp-кода. –