【发布时间】:2018-08-12 18:15:14
【问题描述】:
因此,我正在研究 Paul Graham 的 Common Lisp 并且有一个问题要求创建一个联合函数,该函数维护被联合化的列表中元素的顺序。为此,我编写了以下函数:
(defun new-union (listA listB)
(setq retset (list (car listA)))
(loop for el in (append (cdr listA) listB)
do (if (not(member el retset))
(push el (cdr (last retset)))))
(return-from new-union retset))
这会在保持顺序的同时返回每个列表的唯一元素,因此如果我创建并运行:
(setq listA '(a b c a))
(setq listB '(c d e))
(new-union listA listB)
返回是:
(A B C D E)
所以第一件事是我收到编译器警告:"undefined variable: RETSET" 在这一行:(setq retset (list (car listA)))。另一件事是,上述方法似乎是一种更“面向对象”的做事方式,而不是带有return-from 语句的LISP 方式。
是否可以以更“适合lisp”的方式编写此代码而不会出现编译器错误?
*编辑:使用@Sylwester 的答案,我重写了如下函数并且没有错误:
(defun new-union (listA listB)
(let ((retset (list (car listA))))
(loop for el in (append (cdr listA) listB)
do (if (not (member el retset))
(push el (cdr (last retset)))))
retset))
【问题讨论】:
-
您的函数尝试将项目推送到链表的末尾。这不是单链表的好用处。
标签: functional-programming common-lisp sbcl