我尝试从列表中删除随机元素,直到列表为空。我的环境是Allegro Lisp,免费版。
(setq set1 '(Nr1 Nr2 Nr3))
(delete (nth (random (length set1)) set1) set1)
经过一些重复之后,对delete
(和set1
的内容)的顺序调用的输出开始看起来像这样:
(NR1 NR2 NR3)
(NR2 NR3)
(NR1 NR2)
(NR1)
NIL
也就是说,有时项没有被删除,有时被删除的项重新出现。如果我使用remove
,就不会有这样的问题。
这是一个bug还是我错过了关于delete
的一些东西?
delete
允许销毁/改变/重用原始列表的部分来返回结果,这有两个含义:
- 你应该使用
(setf set1 (delete ...))
- 改变引号列表不是一个好主意,只需使用
(setf set1 (list 'Nr1 'Nr2 'Nr3))
代替
当要求delete
删除列表的第一个元素时,允许简单地返回(cdr list)
,您需要返回(setf set1 (delete (nth (random (length set1)) set1)))