我试图对集合执行破坏性操作,并注意到 delete-if 在 SBCL 和 GNU CLISP 中给了我令人惊讶的结果。
将 setf 与 remove-if 结合使用可以按预期工作,但我不明白为什么 delete-if 不修改列表。
这是我的代码
(format t "trying weird delete-if problem~%")
(defun data ()
(loop for x from 1 to 9 by 2 collect (cons x (1+ x))))
(defparameter *c1* (data))
(defparameter *c2* (data))
(format t "*c1* is now ~A~%" *c1*)
(format t "*c2* is now ~A~%" *c2*)
(delete-if
(lambda (x)
(progn
(format t "trying to compare ~A ~A~%" x (equal x (cons 1 2)))
(equal x (cons 1 2))))
*c1*)
(format t "now trying remove-if~%")
(setf *c2* (remove-if
(lambda (x)
(progn
(format t "trying to compare ~A ~A~%" x (equal x (cons 1 2)))
(equal x (cons 1 2))))
*c2*))
(format t "*c1* is now ~A~%" *c1*)
(format t "*c2* is now ~A~%" *c2*)