LISP将项从for循环追加到数组中

时间:2015-05-09 04:16:18

标签: lisp

如果此项尚未包含在数组中,我尝试将项添加到数组中。基本上我想要实现的是迭代遍历列表,通过检查它们是否已经存在来删除任何重复项。

以下是我的成就:

(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。我知道这与访问itemnewList的方式有关,并且无法弄清楚如何纠正它。

1 个答案:

答案 0 :(得分:3)

错误是由括号括起do表单的正文引起的。 Parens在lisp中有意义,因此这样的“额外”包装将破坏代码。

还有其他一些错误。 setq用于分配未绑定的变量。您应该使用let来建立绑定。该变量的初始值是包含()的单长列表,而它应该只是()

reduce已经是一个Common Lisp函数,所以名称的差异选择是个好主意。

最后,格式不是惯用的或一致的 - 您有mylistnewList。 lisp程序员会拼写这些名称my-listnew-list

以下是清理一下后的样子。我已经留下了一些重要的部分供你填写。

(defun unique-elements (list)
  (let ((result ()))
    (loop for item in list
          do (when (not (member item result))
               ...))
    ...))

(使用loop的收集机制来完成这项工作会更干净,但我决定如何使用do会更有帮助。)