【发布时间】:2016-06-28 21:32:56
【问题描述】:
我正在尝试通过在 LISP 中使用以下代码添加到一个空列表来构造一个唯一的元素列表:
;;;MEMSET - return T if an atom is a top-level member of a set, else NIL
;;;This is needed for the makeset function
(DEFUN MEMSET (ATM L)
(COND ( ( NULL L) NIL )
( (EQL ATM(CAR L)) T )
( T (MEMSET ATM (CDR L)) )
)
)
(DEFUN MAKESET(SET1)
(DO ((UNIQ ()))
( (NULL SET1) UNIQ)
(COND ( (NOT (MEMSET (CAR SET1) UNIQ))
(CONS (CAR SET1) UNIQ)
)
)
(SETF SET1 (CDR SET1))
)
)
当我调用 (makeset '(abbacdba)) 时,此特定代码导致 NIL - 它应该导致 (abcd),不考虑顺序) - 但在我看来,它应该是从 SET1 添加一个原子尚未在每次迭代的 UNIQ 中。您不能添加到在 do 循环中声明的空列表中,还是我遇到了其他问题?顺便说一句,我正在使用 clisp。
【问题讨论】:
-
请把标题改成事实。这可能需要首先找到真实的真相(通过剥离所有不相关的内容)。
-
除了前面的注释,请修复代码格式:小写、缩进、挂括号。 Emacs 应该会有所帮助。
-
简短的回答是
(cons x y)没有修改任何东西;它返回一个新的cons-cell。之后x和y与之前相同。结果是您想要的新值。这意味着你需要像(setq y (cons x y))这样的东西。 -
谢谢大家的帮助。我意识到格式有点不稳定。这是我编写的第一个 LISP 程序之一。
标签: lisp common-lisp