我試圖通過向一個空列表,使用下面的代碼在LISP構建元素的唯一列表: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))
)
)
這個特殊的代碼導致NIL當我打電話(makeset「(abbacdba)) - 它應該導致(abcd),而不考慮順序) - 但是在我看來,它應該從SET1中添加一個原子,這個原子在每次迭代中還不在UNIQ中。你可以不添加到do循環中聲明的空列表,還是有一些其他問題我有?順便說一下,我正在使用clisp。
請修正標題是一個道理。這可能涉及到首先發現真實的事實(通過剝去一切無關緊要的東西)。 – user2864740
除了以前的評論,請修復代碼格式:縮寫,縮進,掛件。 Emacs應該有所幫助。 – sds
簡短的回答是'(cons x y)'不會修改*任何東西;它*返回*一個新的細胞。之後'x'和'y'與之前的一樣。結果是你想要的新價值。這意味着你需要像'(setq y(cons x y))'這樣的東西。 –