リストを繰り返し処理し、要素を使用してアクションを実行し、いくつかの基準に基づいて、アクティブな要素を削除したいと思います。ただし、以下の関数を使用すると、無限ループに陥ります。
(defun foo (list action test)
(do ((elt (car list) (car list)))
((null list))
(funcall action elt)
(when (funcall test elt)
(delete elt list))))
(setq list '(1 2 3 4))
(foo list #'pprint #'oddp)
-> infinite loop
それ自体を指しているのでそれは不可能ですか?結局のところ、もちろんですelt
。(car list)
これは正しい評価ですか?そして、どうすればこれを効率的に解決できますか?