gpt4 book ai didi

list - 在 common lisp 中永久更改列表

转载 作者:行者123 更新时间:2023-12-05 01:35:08 25 4
gpt4 key购买 nike

我有一个在循环中使用的列表,在每次迭代中我应用一个函数来永久改变列表(弹出和添加元素)。问题是,当它为 nil 时,原始列表永远不会改变。我该如何解决这个问题?我的代码如下所示

(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 个以上的元素,代码将按预期工作。如果它恰好包含 1 个元素,一旦该元素被弹出并且列表变为 nil,应用的更改将不再对列表永久有效。我想这是因为 nconc 的定义方式,如果第一个参数为 nil,则只返回第二个参数而不做任何更改。关于如何解决这个问题有什么想法吗?

PS:我知道上面的代码没有用,但我在一个学校项目中使用了相同的概念,不幸的是我无法发布代码。

最佳答案

改变

(add-to-list (1+ num) queue)

(setq queue (add-to-list (1+ num) queue))

你不能用nconc“扩展”nil

(nconc nil . lists)

相当于

(nconc . lists)

所以,你需要把add-to-list的结果放入queue

关于list - 在 common lisp 中永久更改列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com