Вы можете использовать этот elisp (который требует cl
):
(defun remove-first (elt seq)
(let ((remove-first t))
(remove-if (lambda (e) (when (and remove-first (equal elt e))
(setq remove-first nil)
t))
seq)))
Примечание: это делает копию оригинального списка. Для того, чтобы использовать побочные эффекты, попробуйте это:
(defun remove-first* (elt seq)
(if (equal elt (car seq))
(cdr seq)
(while (cdr seq)
(if (equal elt (cadr seq))
(progn (setcdr seq (cddr seq))
(setq seq nil))
(setq seq (cdr seq))))
seq))
Примечание: когда первый элемент является удаленным, возвращается только cdr
, поэтому, как всегда, с этим типом операции, вызывайте его так:
(setq mylist (remove-first* 3 mylist))