我有一個循環內使用的列表,並且在每次迭代中,我都會應用一個將永久更改列表的函數(彈出和添加元素)。問題是,原始列表永遠不會更改,只要它是零。我該如何解決這個問題?我的代碼如下所示永久變更列表lisp
(defun looping-func()
(let ((queue '(2)))
(loop while (not (null queue)) do
(let ( (num (pop queue)))
(if (oddp num)
(format t "~%~A success" num)
(progn (format t "~%fail")
(add-to-list (1+ num) queue)))))))
(defun add-to-list (elem l)
(nconc l (list elem)))
如果列表包含多個元素,代碼將按預期工作。如果它恰好包含1個元素,那麼一旦該元素被彈出並且列表變爲零,則應用的更改不再是列表中的永久元素。我想這是因爲nconc是如何定義的,如果第一個參數是零,只是返回第二個沒有任何改變。有關如何去做這件事的任何想法?
PS:我知道上面的代碼是沒用的,但我對學校項目使用了相同的概念,所以我不幸發佈了代碼。
你不應該在文字列表上使用'nconc'這樣的破壞性修改函數 - 修改文字會導致未定義的行爲。將'queue'的初始化更改爲'(list 2)'。 – Barmar