LISP 从 for 循环将项目附加到数组
LISP appending item to array from a for loop
我正在尝试向数组中添加一个项目,如果该项目不在数组中。本质上,我想要实现的是遍历列表,通过检查它们是否已经存在来删除所有重复项。
我是这样开始的:
(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
的访问方式有关,但不知道如何更正它。
错误是由于 do
表格的正文用括号括起来引起的。 Parens 在 lisp 中有意义,所以 'extra' 像这样包装会破坏代码。
还有一些其他的错误。 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
的示例会更有帮助。)
我正在尝试向数组中添加一个项目,如果该项目不在数组中。本质上,我想要实现的是遍历列表,通过检查它们是否已经存在来删除所有重复项。
我是这样开始的:
(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
的访问方式有关,但不知道如何更正它。
错误是由于 do
表格的正文用括号括起来引起的。 Parens 在 lisp 中有意义,所以 'extra' 像这样包装会破坏代码。
还有一些其他的错误。 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
的示例会更有帮助。)