如果此项尚未包含在数组中,我尝试将项添加到数组中。基本上我想要实现的是迭代遍历列表,通过检查它们是否已经存在来删除任何重复项。
以下是我的成就:
(defun reduce(mylist)
(setq newList (list ()) )
(loop for item in mylist
do (
(if (not (member item newList))
)
))
)
(reduce '(3 4 5 4 5))
我得到的错误是(IF (NOT (MEMBER 'ITEM 'NEWLIST))) should be a lambda expression
。我知道这与访问item
和newList
的方式有关,并且无法弄清楚如何纠正它。
答案 0 :(得分:3)
错误是由括号括起do
表单的正文引起的。 Parens在lisp中有意义,因此这样的“额外”包装将破坏代码。
还有其他一些错误。 setq
用于分配未绑定的变量。您应该使用let
来建立绑定。该变量的初始值是包含()
的单长列表,而它应该只是()
。
reduce
已经是一个Common Lisp函数,所以名称的差异选择是个好主意。
最后,格式不是惯用的或一致的 - 您有mylist
和newList
。 lisp程序员会拼写这些名称my-list
和new-list
。
以下是清理一下后的样子。我已经留下了一些重要的部分供你填写。
(defun unique-elements (list)
(let ((result ()))
(loop for item in list
do (when (not (member item result))
...))
...))
(使用loop
的收集机制来完成这项工作会更干净,但我决定如何使用do
会更有帮助。)