(删除)的奇怪行为.在快板中



我尝试从列表中删除随机元素,直到列表为空。我的环境是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允许销毁/改变/重用原始列表的部分来返回结果,这有两个含义:

  1. 你应该使用(setf set1 (delete ...))
  2. 改变引号列表不是一个好主意,只需使用(setf set1 (list 'Nr1 'Nr2 'Nr3))代替

当要求delete删除列表的第一个元素时,允许简单地返回(cdr list),您需要返回(setf set1 (delete (nth (random (length set1)) set1)))

最新更新