我正在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代码。 –