gpt4 book ai didi

lisp - 普通口齿不清 : is delete-if the same as setf + remove-if?

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:17 26 4
gpt4 key购买 nike

以下代码生成从 1 到 n 的素数:

(defun prime-list(n)
(let ((a)(b)(x (floor (sqrt n))))
(loop for i from (floor n 6) downto 1 do
(push (1+ (* 6 i)) a)
(push (1- (* 6 i)) a))
(loop while (<= (car a) x) do
(push (car a) b)
(setf a (remove-if #'(lambda(m)(or (= 0 (mod m (car a))) (> m n))) a)))
(append '(2 3) (reverse b) a)))

在我看来这部分

(setf a (remove-if #'XXX a)) 

可以替换为

(delete-if #'XXX a)

我希望这能让它更快。但是,当我进行更改时,该函数现在进入无限循环并且永远不会返回。为什么?

最佳答案

如评论中所述,您需要设置变量。

DELETE-IF 主要是 REMOVE-IF 的破坏性版本。 REMOVE-IF 返回一个新的 consed 序列,其中不包含已删除的元素。 DELETE-IF 可能会返回一个被重用的序列。

如果你有一个绑定(bind)到列表的变量,你仍然需要设置结果。上面的函数返回结果,但它们没有为结果设置变量。在列表的情况下,DELETE-IF 操作的结果可能是空列表,并且不可能有副作用,可以为其设置变量 - 当它指向到一个非空列表。

关于lisp - 普通口齿不清 : is delete-if the same as setf + remove-if?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11660804/

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